我正在尝试覆盖主题文件中基本控件(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中执行此操作。
谢谢
答案 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 Extension。 ThemeDictionary
从程序集中加载适合主题的ResourceDictionary
。
Here是指静态工作的人,这似乎是你想要的。
答案 2 :(得分:1)
问题是你得到循环引用。这是因为您使用类XXX定义样式,但也使用与基本资源相同的资源。
我在很久以前写了一篇关于这篇文章的博客文章,它解释了该怎么做:
诀窍是使用键“DefaultTextBoxStyle”在同一资源字典中定义一个样式,然后使用右键(“{x:Type TextBox}”以编程方式将样式添加到主应用程序资源。这样,你避免使用循环引用。