WPF不会将样式应用于第一个元素

Sco*_* M. 24 wpf resources styles resourcedictionary

我有一个简单的WPF窗口,上面有12个按钮.我希望将相同的样式应用于所有这些样式.此代码产生相同的错误:

<Window x:Class="TestApp.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TestWindow" Height="400" Width="500"
        WindowStyle="None" WindowState="Maximized">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/AllResources.xaml"/>
                <ResourceDictionary>
                    <Style TargetType="{x:Type Button}">
                        <Setter Property="FontSize" Value="100"/>
                    </Style>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button Grid.Column="0" Content="1" Name="Button1"/>
        <Button Grid.Column="1" Content="2" Name="Button2"/>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

第一个按钮没有应用它的样式,但第二个按钮没有.我可以设置一个键并在每个按钮上使用它,但我更愿意让WPF为我处理.我在写这篇文章时发现,当我不包含外部ResourceDictionary时,它按预期工作.这将是一个问题,因为我的应用程序扩展,因为我有多个需要共享相同资源的窗口.修改后的代码如下:

<Window x:Class="TestApp.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TestWindow" Height="400" Width="500"
        WindowStyle="None" WindowState="Maximized">
    <Window.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="FontSize" Value="100"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button Grid.Column="0" Content="1" Name="Button1"/>
        <Button Grid.Column="1" Content="2" Name="Button2"/>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

如果我(而不是删除合并的词典)添加x:Key ="key"属性,然后将该样式显式分配给每个按钮,它也可以工作.

这是什么问题?为什么第一个跳过"Button1"而第二个不跳?

Fre*_*lad 19

我之前几次见过这个问题,这是一个非常奇怪的"错误".当你把一个Style直接放在ResourceDictionary里面时它会发生<ResourceDictionary.MergedDictionaries>.该Style被跳过的第一个项目.此代码生成相同的结果,第一个跳过StyleListBoxItem

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="Foreground" Value="Green"/>
                </Style>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<ListBox>
    <ListBoxItem Content="Item 1"/>
    <ListBoxItem Content="Item 2"/>
    <ListBoxItem Content="Item 3"/>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

要使样式和MergedDictionaries都能正常工作,请改为使用它

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources/AllResources.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <Style TargetType="{x:Type Button}">
            <Setter Property="FontSize" Value="100"/>
        </Style>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Button Grid.Column="0" Content="1" Name="Button1"/>
    <Button Grid.Column="1" Content="2" Name="Button2"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)


Ric*_*key 5

尽管它不会产生错误,但根据文档:

合并字典中使用的字典不应该有内容,并且应该使用该Source属性间接引用另一个字典。事实上,如果您将 放入Style资源字典中并在合并中引用它们,它就会按预期工作。

我们只能推测为什么不支持这一点,但既然不支持,而且解决方法很简单,我们不能抱怨太多,除非希望我们在编译时收到错误。