覆盖 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 中的主题的主要内容,如果未能解决你的问题,请参考以下文章

ResourceDictionary主题资源替换 :通过加载顺序来覆盖之前的主题资源

WPF 更改(覆盖)所有控件中的突出显示和边框颜色

WPF 更改或覆盖默认系统颜色

材质UI选择覆盖主题中的位置

如果样式已经设置,如何覆盖 WPF 子控件样式?

如何用自己的主题覆盖yii2.0中的当前主题