2010-11-25 4 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

+0

또한이 솔루션을 확인해야합니다. http://stackoverflow.com/questions/431940/how-to-set-default-wpf-window-style-in-app-xaml –

3

디자이너와는 작동하지만 응용 프로그램이 작동하지 않는 것은 매우 이상합니다. 문제는 귀하의 스타일의 TargetType 인 것 같습니다. Wpf는 파생 클래스 TryingStyles와 Window 클래스를 일치시킬 수 없습니다.

당신은 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

관련 문제