【问题标题】:WPF doesn't apply style to first elementWPF 不会将样式应用于第一个元素
【发布时间】:2011-01-27 00:46:33
【问题描述】:

我有一个简单的 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 为我处理。我刚刚在写这篇文章时发现,当我不包含外部 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>

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

这里有什么问题?为什么第一个跳过“Button1”而第二个不跳过?

【问题讨论】:

  • 什么--?你是对的!我以前从未见过这种情况。 +1 以获得很好的可重现代码示例。
  • 听起来像是 WPF 中的一个错误。我记得单条目资源字典实际上存在问题。您能否尝试在包含该样式的资源字典中再添加一个(虚拟)项目? (我现在没有编译器。)
  • 当我有 2 个按钮时,我遇到了同样的问题,每个按钮都有一个堆栈面板和 2 个标签。第一个标签不会得到样式,但其他 3 个会。该死的 WPF 错误...有人知道我如何提交错误报告吗?

标签: wpf resources styles resourcedictionary


【解决方案1】:

我之前已经多次看到这个问题,这是一个非常奇怪的“错误”。当您将Style 直接放入ResourceDictionary 内&lt;ResourceDictionary.MergedDictionaries&gt; 时,就会发生这种情况。第一项将跳过Style。此代码产生相同的结果,第一个 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>

要让样式和 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>

【讨论】:

  • 成功了!谢谢。我想我的印象是,如果资源字典已合并字典,则不允许它具有样式。
  • 哇,确实很奇怪。感谢您的清晰解释,它完美无缺。
  • 非常感谢,这解决了我经过大量调试后发现的错误。多么奇怪的bug,我是在删除所有其他代码后才发现的。
【解决方案2】:

虽然它不会产生错误,但根据文档:

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

我们只能推测为什么不支持它,但既然不支持,而且由于解决方法很简单,我们不能太痛苦地抱怨,只是希望我们在编译时收到错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多