Стиль окна WPF не применяется

У меня есть ResourceDictionary, который содержит определения стилей для элементов управления, используемых в моем приложении.

Все стили правильно применяются к элементам управления в окне ... но стиль в ResourceDictionary для самого окна не применяется.

Это XAML в моем ResourceDictionary, который содержит стиль, который я хочу применить к своему окну:

<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, но когда я запускаю приложение, стиль не применяется.

Кто-нибудь знает, что я делаю не так?


person Frinavale    schedule 25.11.2010    source источник


Ответы (2)


Похоже, что у вашей проблемы нет правильного решения. TargetType в стилях не управляет производными типами. Вот две альтернативы: вы можете добавить ключ к своему стилю и применить его ко всем вашим Windows.

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

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

Или вы можете использовать свойство BasedOn класса Style.

<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>
person Nicolas    schedule 26.11.2010
comment
Большое спасибо за помощь Николас :) - person Frinavale; 03.12.2010
comment
Вы также должны проверить это решение: stackoverflow.com/questions/431940/ - person Ignacio Soler Garcia; 29.08.2011

Очень странно, что с дизайнером работает, а не при запуске приложения. Проблема, похоже, заключается в 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>
person Nicolas    schedule 25.11.2010
comment
Пока это работает, мне придется делать это для каждого окна в моем приложении. Я бы предпочел иметь один стиль окна, который можно было бы применить ко всем окнам в моем приложении. - person Frinavale; 25.11.2010