覆盖 WPF 中的主题
Posted
技术标签:
【中文标题】覆盖 WPF 中的主题【英文标题】:Overriding themes in WPF 【发布时间】:2011-04-03 16:31:35 【问题描述】:我目前正在处理的 wpf 项目有一个小问题。我是 WPF 的新手。在我的 app.xaml 中,我为我的应用程序使用 Microsoft Aero 主题。我的 app.xaml 中有类似的东西
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/Aero.NormalColor.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
现在我想知道如何覆盖某些样式属性,例如对于按钮,我想覆盖字体样式,同时保留其余的航空样式。
如果我在窗口资源中为按钮定义样式,例如
<Style TargetType="x:Type Button" BasedOn="StaticResource x:Type Button" x:Key="RedTextBasedOnButton">
<Setter Property="Foreground" Value="Red" />
</Style>
并根据上述样式定义一个按钮
该按钮失去了所有的航空风格属性。我认为问题在于我为样式定义 BasedOn 属性的方式
BasedOn="StaticResource x:Type Button"
我认为资源不是静态的,因为它来自 dll,它可能应该是这样的。不过不确定。
BasedOn="DynamicResource x:Type Button"
但是上面会抛出异常,如果我的 app.xaml 中有多个资源字典怎么办?露娜和经典。我如何知道将哪个用作默认值,同时使用和覆盖另一个(例如 luna)专门用于我的 ui 中的某些控件?所以我的一些按钮将基于 luna 风格,而另一些则基于 aero 风格,并进行了一些进一步的修改?
有什么想法吗?
问候,
【问题讨论】:
Override Overriden WPF Theme 的可能重复项 是否有任何样式具有可以绑定的显式键? 1.动态链接 DLL 与动态链接资源无关 2. BasedOn 必须始终是静态资源 【参考方案1】:关于您的具体问题
例如对于按钮,我想覆盖字体样式,同时保留其余的航空样式。
我会尝试将其添加到您的资源字典中:
<FontFamily x:Key="YourFont">Tahoma</FontFamily>
然后在你的风格中使用它:
<Style TargetType="x:Type Button" BasedOn="StaticResource x:Type Button" x:Key="RedTextBasedOnButton">
<Setter Property="FontFamily" Value="StaticResource YourFont"/>
</Style>
因此您可以根据一个键更改 FontFamily。
我推荐看看这个http://wpfthemes.codeplex.com/SourceControl/latest#WPF.Themes.Demo/Window1.xaml
【讨论】:
以上是关于覆盖 WPF 中的主题的主要内容,如果未能解决你的问题,请参考以下文章