WPF不';不要将样式应用于第一个元素

WPF不';不要将样式应用于第一个元素,wpf,resources,styles,resourcedictionary,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="TestWind

我有一个简单的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>

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

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

如果我(而不是删除合并的字典)添加一个x:Key=“Key”属性,然后显式地将该样式分配给每个按钮,那么它也可以工作


这里的问题是什么?为什么第一个跳过“按钮1”,第二个不跳过?

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

合并词典中使用的词典不应包含内容,应使用
Source
属性间接引用其他词典。事实上,如果您将
样式
放在一个资源字典中,并在合并中引用这两个样式,它就会正常工作


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

我以前见过几次这个问题,这是一个非常奇怪的“错误”。当您将
样式
直接放入
资源字典
时,就会发生这种情况。第一项跳过
样式
。此代码生成相同的结果,第一个
ListBoxItem的样式被跳过

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

要使样式和合并都起作用,请改为这样做

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


什么是--?你说得对!我以前从未见过这种情况+这是一个很好的可复制代码示例。听起来像WPF中的一个bug。我记得单条目资源字典实际上有一个问题。请尝试向包含样式的资源字典中再添加一个(虚拟)项,好吗?(我现在没有编译器。)我有两个按钮时也遇到了同样的问题,每个按钮都有一个stackpanel和两个标签。第一个标签无法获得样式,但其他3个标签可以。该死的WPF错误。。。有人知道我是如何提交错误报告的吗?真管用!谢谢我想我的印象是,如果资源字典合并了字典,它就不允许有样式。哇,真的很奇怪。谢谢你的清晰解释,它工作得完美无缺。非常感谢,这解决了我在难以置信的数小时调试后发现的一个bug。这是一个多么奇怪的bug,我只是在删除了所有其他代码后才发现它的。