我有一个简单的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”而第二个没跳过?
答案 0 :(得分:17)
我之前已经看过几次这个问题了,这是一个非常奇怪的“错误”。当您将Style
直接放在ResourceDictionary
<ResourceDictionary.MergedDictionaries>
内时,就会发生这种情况。第一项跳过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>
答案 1 :(得分:4)
虽然它没有产生错误,但根据文档:
合并字典中使用的字典不应该有内容,应该使用Source
属性间接引用另一个字典。实际上,如果将Style
放在资源字典中并在合并中引用它们,它就可以正常工作。
我们只能推测为什么不支持它,但由于它不是,并且由于解决方法很简单,我们不能抱怨太多,除非希望我们在编译时收到错误。