2016-04-26 85 views
0

我有一個wpf應用程序,在這裏我做了一個帶有標籤和按鈕的內容控制器。這將被用作加載時的覆蓋。 的.cs文件wpf ResourceDictionary不適用於ContentControl

namespace VLC.WPF.Controls 
{ 
    public class LoadingOverlay : ContentControl 
    { 
    } 
} 

的文件名爲.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:VLC.WPF.Controls"> 
    <Style TargetType="local:LoadingOverlay"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Grid> 
         <Grid Background="Black" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Opacity="0.8"> 
          <ContentPresenter Content="{Binding OverlayContent}"/> 
         </Grid> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 

     </Setter> 
    </Style> 
</ResourceDictionary> 

這一切都將使用這樣

<UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/../Controls/LoadingOverlay.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </UserControl.Resources> 

    <controls:LoadingOverlay> 
     <controls:LoadingOverlay.Resources> 
      <Style TargetType="controls:LoadingOverlay"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=RefreshNotifyTask.IsCompleted}" Value="True"> 
         <Setter Property="Visibility" Value="Hidden"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </controls:LoadingOverlay.Resources> 
      <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> 
       <TextBlock Foreground="White" FontSize="20" Text="Artikelen vernieuwen ..." /> 
       <Button x:Name="Cancel" Content="Annuleren"/> 
      </StackPanel> 
    </controls:LoadingOverlay> 
各種用戶控件

,其功能正常,但沒有按styly」似乎加載。

這裏有什麼問題?代碼看起來不錯,所以我認爲它應該加載,但它不是。

+0

儘量把'<樣式的TargetType =「本地:LoadingOverlay「>'到'App.xaml'文件 – StepUp

+0

一定忘了在原文中添加它,但整個樣式部分也在app.xaml中。唯一的區別是本地被控件取代。 –

回答

1
在你的風格嘗試添加的TargetType您的ControlTemplate這樣

<ControlTemplate TargetType="local:LoadingOverlay"> 

我不明白的是你爲什麼要設置在用戶控件資源定型,不使用按鍵來引用樣式您的ResourceDictionary

。這樣可以保證你的整個代碼乾淨多了,你就不必更改每個控件,如果你必須做出一個小的改動後...例如:

<Style x:Key="overlayOne" TargetType="local:LoadingOverlay"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="local:LoadingOverlay"> 
      <Grid> 
       <Grid Background="Black" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Opacity="0.8"> 
       <ContentPresenter Content="{Binding OverlayContent}"/> 
       </Grid> 
      </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=RefreshNotifyTask.IsCompleted, RelativeSource={RelativeSource Self}} Value="True"> 
     <Setter Property="Visibility" Value="Hidden"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

當你調用控件在

<local:LoadingOverlay Style="{DynamicResource overlayOne}"> 
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <TextBlock Foreground="White" FontSize="20" Text="Artikelen vernieuwen ..." /> 
      <Button x:Name="Cancel" Content="Annuleren"/> 
     </StackPanel> 
</local:LoadingOverlay> 

,如果你發現你需要改變風格另一個頁面,而不是做一個內嵌樣式的控制 - 最初定義的樣式後,試試這個:

<Style x:Key="overlayTwo" TargetType="local:LoadingOverlay" BasedOn="{StaticResource overlayOne}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=RefreshNotifyTask.IsCompleted, RelativeSource={RelativeSource Self}} Value="True"> 
      <Setter Property="Background" Value="Green"/> 
     </DataTrigger> 
     </Style.Triggers> 
</Style> 

這樣式使用您已定義的所有信息並添加另一個數據觸發器,或者您可以覆蓋其中的內容,更改字體大小或顏色等樣式中的其他元素。

然後,你就必須定義您的控制

<local:LoadingOverlay Style="{DynamicResource overlayTwo}"> 
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <TextBlock Foreground="White" FontSize="20" Text="Artikelen vernieuwen ..." /> 
      <Button x:Name="Cancel" Content="Annuleren"/> 
     </StackPanel> 
</local:LoadingOverlay> 

對不起,長篇大論的回答時使用此鍵,但是我看到這是一個潛在的問題,如果你有不同的頁面上有很多這些控件並且不會將所有樣式保留在ResourceDictionary中如果你的內容將是相同也可以像下面

<Style x:Key="overlayOne" TargetType="local:LoadingOverlay"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="local:LoadingOverlay"> 
      <Grid> 
       <Grid Background="Black" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Opacity="0.8"> 
       <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <TextBlock Foreground="White" FontSize="20" Text="Artikelen vernieuwen ..." /> 
      <Button x:Name="Cancel" Content="Annuleren"/> 
     </StackPanel> 
       </Grid> 
      </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=RefreshNotifyTask.IsCompleted, RelativeSource={RelativeSource Self}} Value="True"> 
     <Setter Property="Visibility" Value="Hidden"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

風格的一部分,那麼你只需要在網頁上

<local:LoadingOverlay Style="{DynamicResource overlayOne}"/> 
+0

現在確實顯示了這種風格,它幫助我獲得了更多的見解。但是現在沒有顯示按鈕和標籤。因爲這兩個文本都會有所不同,所以它們不能成爲疊加層的一部分。 –

+0

好吧,嘗試更改內容綁定到'',看看是否有幫助嗎? – trippedOverXaml

+0

不會改變它。奇怪的是,當樣式不加載時它顯示。但它是網格的一部分,所以我不認爲它可以顯示在它下面。 –

0

資源必須在將要使用它的UI元素之前定義。如果控件使用樣式資源,則該樣式在視覺樹中必須更高。

移動風格的用戶控件資源

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/../Controls/LoadingOverlay.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="controls:LoadingOverlay"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=RefreshNotifyTask.IsCompleted}" Value="True"> 
        <Setter Property="Visibility" Value="Hidden"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ResourceDictionary> 
</UserControl.Resources> 

<controls:LoadingOverlay> 
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> 
     <TextBlock Foreground="White" FontSize="20" Text="Artikelen vernieuwen ..." /> 
     <Button x:Name="Cancel" Content="Annuleren"/> 
    </StackPanel> 
</controls:LoadingOverlay> 
1

你居然LoadingOverlay資源範圍內覆蓋風格。

<Style TargetType="controls:LoadingOverlay">替換成<Style TargetType="{x:Type controls:LoadingOverlay}" BasedOn="{StaticResource {x:Type controls:LoadingOverlay}}">並瞧!

+0

這實際上幫助我,並加載了樣式,但現在按鈕和標籤不再在屏幕上。 –