2011-01-11 72 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}「)編程添加樣式到主應用程序資源。這樣,您可以避免循環引用。