2010-11-25 9 views
17

Tengo un ResourceDictionary que contiene definiciones de estilo para los controles utilizados en mi aplicación.El estilo de ventana de WPF no se aplica

Todos los estilos se aplican correctamente a los controles en la ventana ... pero el estilo en ResourceDictionary para la ventana no se está aplicando.

Este es el XAML en mi ResourceDictionary que contiene el estilo que quiero aplicar a mi ventana:

<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> 

Este es el XAML para la ventana que estoy trabajando con (tratando de conseguir este estilo de aplique):

<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> 

parece que el estilo de la ventana se aplica cuando veo la ventana de "vista Diseño" del IDE pero cuando corro la aplicación no se aplica el estilo.

¿Alguien sabe lo que estoy haciendo mal?

Respuesta

24

Parece que no hay una solución adecuada a su problema. TargetType in Styles no administra los tipos derivados. Aquí hay dos alternativas: Puede poner una tecla en su estilo y aplicar el estilo a todas sus ventanas.

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

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

o puede utilizar la propiedad BasedOn del estilo.

<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

Muchas gracias por su ayuda Nicolas :) – Frinavale

+0

También debe verificar esta solución: http://stackoverflow.com/questions/431940/how-to-set-default-wpf-window-style-in-app-xaml –

3

Es muy extraño que funcione con el diseñador pero no cuando se ejecuta la aplicación. El problema parece ser el TargetType de su estilo. Parece que Wpf no puede hacer coincidir la clase Window con su clase derivada TryingStyles.

Cambiar la TargetType y funcionará:

<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

Aunque esto funciona, voy a tener que hacer esto para todas las ventanas de mi solicitud. Preferiría tener un estilo de ventana que se pueda aplicar a todas las ventanas de mi aplicación. – Frinavale

Cuestiones relacionadas