我试图在我的 WPF应用程序中继承某个Window的应用程序级样式,但是我很难让它继承而不是简单地覆盖现有的样式. 在App.xaml中(在App.Resources元素下)我定义了一个样式: Style TargetType="Butto
在App.xaml中(在App.Resources元素下)我定义了一个样式:
<Style TargetType="Button"> <Setter Property="Padding" Value="6"/> <Setter Property="FontWeight" Value="Bold"/> </Style>
在XAML论坛中,我在Window.Resources下定义了以下内容:
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}"> <Setter Property="Padding" Value="6"/> <Setter Property="FontWeight" Value="Bold"/> </Style>
这里的问题是前一个(app)样式被忽略,好像后一个(窗口)样式已经覆盖它.设置了BasedOn属性,用于表示应该继承现有样式,据我所知.删除属性也无济于事.我能想到的唯一潜在原因是{StaticResource {x:Type Button}}仅引用默认的WPF样式,而不是我在App.xaml中定义的样式.
我知道使用x:Key属性可以实现这种样式行为,但我希望有一种更优雅的方式,允许我将具有继承的样式应用于范围内的所有控件(即应用程序/窗口).
更新
感谢您的回复.你确实在样本应用程序中按预期工作是对的.不同之处在于我无意中没有提到App.xaml中的样式包含在ResourceDictionary中,因此:
<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="SettingsDictionary.xaml"/> <ResourceDictionary> <Style x:Key="DefaultButton" TargetType="Button"> <Setter Property="Padding" Value="4"/> <Setter Property="HorizontalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/> </Style> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>
关于在这种情况下如何纠正问题的任何建议?
编辑经过一些研究,我发现如果设置了TargetType,则会自动生成x:Key.所以,App.xaml中的样式是正确的.但是,wpf设计器缺乏一些资源处理技能,并且不显示这两种样式.如果您构建并运行项目,则将应用这两种样式.
如果您的机器和VS2008的行为与我测试您的代码的行为相似.
希望这可以帮助.
编辑2
App.xaml中的资源和合并词典一直很古怪.
我通过将第一个样式声明从合并字典中移出来解决了这个问题,如下所示:
<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <!--<ResourceDictionary Source="SettingsDictionary.xaml"/>--> </ResourceDictionary.MergedDictionaries> <Style TargetType="Button"> <Setter Property="Foreground" Value="Red"/> <Setter Property="Padding" Value="4"/> <Setter Property="HorizontalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/> </Style> </ResourceDictionary> </Application.Resources>
另请注意,为样式提供除{x:Type Button}以外的显式设置键将使其成为非默认样式,并使其不会自动应用.
通常建议仅为来自另一个文件的资源指定合并的字典,并在默认空间中指定编码资源,如上所述.