2010-06-26 77 views
1

我創建了一個Generic.xaml主題,設置樣式爲所有常用控件,包括TabItem的 這是他們在應用WPF自定義控件基礎上的TabItem和主題

將確定所有控件當我創建的TabItem控制並顯示它,它會獲得主題OK。

TabItem t = new TabItem(); 
t.Header = "Normal"; 
MainContentControl.Items.Add(t); 

然而,當我創建一個自定義控制基礎上的TabItem

public partial class ClosableTab : TabItem 

,並顯示它

ProActive.LocalControls.ClosableTab ct = new ProActive.LocalControls.ClosableTab(); 
    ct.Header = "COMP"; 
    MainContentControl.Items.Add(ct); 

的主題被忽略。

我已經試過了,如果我的自定義控制是基於一個TabItem的書寫使用

DefaultStyleKeyProperty.OverrideMetadata(typeof(ClosableTab), new FrameworkPropertyMetadata(typeof(TabItem))); 

爲什麼它defaultstyle的主題不是也適用於它?

回答

0

DefaultStyleKey僅用於查找主題樣式。主題樣式必須在定義控件的程序集或根據控制組件中指定的ResourceDictionaryLocation的相關程序集中定義。 TabItem主題位於PresentationFramework.Aero中,WPF將在您的程序集中查找ClosableTab主題,因此即使它們具有相同的密鑰,它也不會找到它們。 Here是WPF查找主題樣式的很好的描述。

隱式樣式將始終使用控件的實際類型進行查找,因此如果您的資源字典中有<Style TargetType="TabItem">,則它不會影響ClosableTab

有ClosableTab繼承的TabItem的隱式樣式最簡單的方法是創建一個隱含的風格ClosableTab和使用BasedOn

<Style TargetType="local:ClosableTab" BasedOn="{StaticResource {x:Type TabItem}}" />