2010-11-25 127 views
17

我有一個ResourceDictionary,其中包含我的應用程序中使用的控件的樣式定義。未應用WPF窗口樣式

所有樣式都正確應用於窗口中的控件......但ResourceDictionary中窗口本身的樣式未應用。

這是我的ResourceDictionary的XAML包含我想申請我的窗口樣式:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:primatives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style TargetType="{x:Type Window}"> 
     <Setter Property="Background" Value="#FF121212"></Setter> 
     <Setter Property="Height" Value="768"></Setter> 
     <Setter Property="Width" Value="1024"></Setter> 
    </Style> 
<!-- .... --> 
</ResourceDictionary> 

這是XAML的,我有(試圖讓這種風格的工作窗口適用):

<Window x:Class="TryingStyles" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="TryingStyles"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Resources/StylesDictionary.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources>  
    <StackPanel> 
     <StackPanel Orientation="Horizontal"> 
      <Label Content="Label" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="Label1" VerticalAlignment="Top" /> 
      <TextBox Height="23" HorizontalAlignment="Left" Margin="56,14,0,0" Name="TextBox1" VerticalAlignment="Top" Width="120" /> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal"> 
      <TabControl Height="206" HorizontalAlignment="Left" Margin="12,43,0,0" Name="TabControl1" VerticalAlignment="Top" Width="250"> 
       <TabItem Header="TabItem1" Name="TabItem1"> 
        <Grid></Grid> 
       </TabItem> 
      </TabControl> 
      <GroupBox Header="GroupBox1" Margin="268,43,12,12" Width="396"></GroupBox> 
     </StackPanel> 
    </StackPanel> 
</Window> 

看來,當我在IDE的「設計視圖」,但是當我運行該應用程序沒有應用該樣式查看窗口的窗口樣式應用。

有誰知道我在做什麼錯?

回答

24

看來,沒有適當的解決您的問題。樣式中的TargetType不管理派生類型。 以下是兩種替代方法: 您可以在您的樣式中放入一個鍵並將樣式應用於所有Windows。

<!-- Resource file -->  
    <ResourceDictionary ...> 
     <Style TargetType="{x:Type Window}" x:Key="WindowDefaultStyle"> 
      <!-- .... -->  
     </Style> 
    </ResourceDictionary> 

    <!-- Window file --> 
    <Window Style="{DynamicResource ResourceKey=WindowDefaultStyle}"> 

或者您可以使用樣式的BasedOn屬性。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:my="clr-namespace:WpfApplication1"> 
    <Style TargetType="{x:Type Window}" x:Key="BaseStyle"> 
     <Setter Property="Background" Value="#FF121212"></Setter> 
     <Setter Property="Height" Value="768"></Setter> 
     <Setter Property="Width" Value="1024"></Setter> 
    </Style> 

    <!-- Inherit from the BaseStyle and define for the MainWindow class --> 
    <Style TargetType="{x:Type my:MainWindow}" BasedOn="{StaticResource ResourceKey=BaseStyle}" /> 
</ResourceDictionary> 
+0

非常感謝您的幫助Nicolas :) – Frinavale 2010-12-03 15:22:56

3

這很奇怪,它與設計者協同工作,而不是在應用程序運行時。 問題似乎是你的風格的TargetType。 Wpf似乎無法將Window類與派生類TryingStyles進行匹配。

更改您的TargetType,它會工作:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:primatives="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:my="clr-namespace:WpfApplication1"> 
    <Style TargetType="{x:Type my:TryingStyles}"> 
     <Setter Property="Background" Value="#FF121212"></Setter> 
     <Setter Property="Height" Value="768"></Setter> 
     <Setter Property="Width" Value="1024"></Setter> 
    </Style> 
    <!-- .... --> 
</ResourceDictionary> 
+1

雖然這個工作,我將不得不這樣做我的應用程序的每個窗口。我寧願有一種窗口樣式可應用於我的應用程序中的所有窗口。 – Frinavale 2010-11-25 20:12:03