【问题标题】:How do I override style in a specific theme如何覆盖特定主题中的样式
【发布时间】:2011-01-11 20:05:56
【问题描述】:

我正在尝试覆盖主题文件中基本控件(文本框、组合框)的默认样式。 像这样:

在主题/classic.xaml 中

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

在主题/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 文件中,我没有问题,但我希望这种样式依赖于主题。 顺便说一句,它适用于我自己的用户控件。

谁能告诉我我在这里做错了什么?

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

谢谢

【问题讨论】:

  • 能否将app.xaml的代码包含进来?

标签: wpf themes styles


【解决方案1】:

您是否在某处引用了您的主题? 例如

<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,除非它只是在主题内被其他样式引用的子样式。

【讨论】:

  • 我确实引用了 aero-dll 中的主题文件(查看之前的评论)。我像这样更改了 assemblyinfo 文件: 所以 wpf 将使用我的扩展主题文件(classic.xaml,aero.normalcolor.xaml, luna.metallic.xaml, .. .)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2020-12-04
    • 2018-01-12
    • 2022-01-11
    • 2011-11-30
    • 2011-01-20
    相关资源
    最近更新 更多