2011-01-11 102 views
3

我试图覆盖主题文件中基本控件(TextBox,ComboBox)的默认样式。 像这样:如何覆盖特定主题的样式

在主题

/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文件中,我没有问题,但我希望这种样式是主题相关的。顺便说一句,它适合我自己的usercontrols。

有人能告诉我我在做什么错吗?

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

谢谢

+0

您能否包含app.xaml的代码? – bendewey 2011-01-11 20:10:13

+0

David 2011-01-11 20:20:24

回答

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,除非它只是在主题内由另一个样式引用的子样式。

+0

我从aero-dll引用了主题文件(在此之前查看注释)。我更改了assemblyinfo文件,如下所示:所以wpf会使用我的扩展的主题文件(classic.xaml,aero.normalcolor.xaml,luna.metallic.xaml,...) – David 2011-01-11 20:23:35

1

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

Here是一个人静静地工作,这似乎是你想要的。

1

问题是您正在获取循环引用。这是因为您使用类XXX来定义样式,但也使用与基础资源相同的资源。

我有一个“长”很久以前写的这一篇博客文章,它解释怎样做:

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

诀窍是用钥匙将同一资源字典定义样式“ DefaultTextBoxStyle“,然后用正确的键(”{x:Type TextBox}“)编程添加样式到主应用程序资源。这样,您可以避免循环引用。