代码之家  ›  专栏  ›  技术社区  ›  Frinavale

未应用WPF窗口样式

  •  17
  • Frinavale  · 技术社区  · 14 年前

    我有一个ResourceDictionary,它包含应用程序中使用的控件的样式定义。

    所有的样式都正确地应用于窗口中的控件…但是在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的“设计视图”中查看窗口时,似乎应用了该窗口的样式,但当我运行应用程序时,则不应用该样式。

    有人知道我做错了什么吗?

    2 回复  |  直到 9 年前
        1
  •  24
  •   Nicolas    14 年前

    看来你的问题没有适当的解决办法。样式中的TargetType不管理派生类型。 有两种选择: 您可以在样式中放置一个键,并将该样式应用于所有窗口。

        <!-- 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>
    
        2
  •  3
  •   Nicolas    14 年前

    很奇怪,它与设计器一起工作,但在应用程序运行时却不工作。 问题似乎是你的风格目标类型。Wpf似乎无法将窗口类与派生类TryingStyles匹配。

    更改目标类型,它将工作:

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