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 в Styles не управлява производни типове. Ето две алтернативи: Можете да поставите ключ във вашия стил и да приложите стила към всички ваши 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>
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