如何覆盖特定主题中的样式

时间:2011-01-11 20:05:56

标签: wpf themes styles

我正在尝试覆盖主题文件中基本控件(TextBox,ComboBox)的默认样式。 像这样:

主题/ classic.xaml

中的

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Background" Value="Black"/>
</Style>

in themes / Aero.NormalColor.xaml

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Background" Value="Green"/>
</Style>

但这似乎不起作用。我总是得到默认的风格,没有任何变化。我甚至用特定的钥匙试了一下 像

<Style x:Key="DefaultTextBoxStyle" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Background" Value="Green"/>
</Style>

并在xaml中声明控件时始终使用此键。似乎没什么用。

如果我将样式放在application.xaml文件中我没有问题,但我希望这个样式与主题相关。 顺便说一句,它适用于我自己的用户控件。

有人能告诉我这里的错误吗?

我知道一个解决方案可能是使用一个类来查看我使用的主题并使用somesort的触发器,但我真的想在xaml中执行此操作。

谢谢

3 个答案:

答案 0 :(得分:1)

你有没有在某个地方引用你的主题? e.g。

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="Test.App">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Simple Styles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

另外,不要在主题中使用x:Key,除非它只是在主题中用其他样式引用的子样式。

答案 1 :(得分:1)

不幸的是,ThemeInfo机制仅用于同一程序集中定义的控件。您想要的是为不属于您自己的控件加载特定于主题的资源。我没有测试过,但我认为你需要的是ThemeDictionary Markup ExtensionThemeDictionary从程序集中加载适合主题的ResourceDictionary

Here是指静态工作的人,这似乎是你想要的。

答案 2 :(得分:1)

问题是你得到循环引用。这是因为您使用类XXX定义样式,但也使用与基本资源相同的资源。

我在很久以前写了一篇关于这篇文章的博客文章,它解释了该怎么做:

http://blog.catenalogic.com/post/2009/07/20/Override-or-customize-WPF-themes-such-as-PresentationFrameworkAero.aspx

诀窍是使用键“DefaultTextBoxStyle”在同一资源字典中定义一个样式,然后使用右键(“{x:Type TextBox}”以编程方式将样式添加到主应用程序资源。这样,你避免使用循环引用。