2009-11-13 207 views
5

我有按鈕派生的自定義控制:WPF定製衍生控制風格

class MyControl : Button{} 

再假設,這個類是空的(沒有成員)。

在應用程序的主窗口資源,我用資源字典包含的樣式大部分WPF控制(所謂的主題):

<ResourceDictionary Source="BureauBlue.xaml" /> 

所以,在窗口看所有控件就像是在主題文件中定義。但是這些樣式在MyControl控件上不受影響。我怎樣才能使MyControl看起來與Button控件相同?

更新:在BureauBlue.xaml按鈕的樣式沒有密鑰,並在下面的方式定義:

<Style TargetType="{x:Type Button}" BasedOn="{x:Null}"> ...</Style> 

回答

14

你在你的靜態構造函數重載DefaultStyleKey的元數據:

static MyControl() 
{ 
    DefaultStyleKeyProperty.OverrideMetadata(
     typeof(MyControl), 
     new FrameworkPropertyMetadata(typeof(MyControl))); 
} 

然後,在你的資源,你可以基座上的按鈕它的風格:

<Style TargetType="{x:Type lcl:MyControl}" BasedOn="{StaticResource {x:Type Button}}" /> 

我已經試過過去重寫DefaultStyleKey的元數據來指向基類(在你的情況下是Button),但它似乎不起作用。

+6

謝謝,這很有效,但很奇怪:如果我在Themes/Generic.xaml中定義了這種樣式,則不起作用。如果我在我的Window或App資源中定義了這種風格,那麼一切都很好。 因此,我不清楚當我在一個程序集中創建ButtonEx控件並從另一個程序集中使用它的情況,那麼如何在控件庫中定義我的ButtonEx控件應該默認爲Button? – Zim 2009-11-13 18:37:35

0

檢查樣式按鈕,在那裏你BureauBlue.xaml 並刪除X:關鍵屬性從樣式中返回

+0

的樣式按鈕在BureauBlue.xaml沒有密鑰,並定義如下忠告: <樣式的TargetType = 「{x:Type Button}」BasedOn =「{x:Null}」> ... – Zim 2009-11-13 15:15:53

3

TargetType屬性不適用於派生自指定類型的類。見this question

1

對於完全代碼this answer on another forum做這個工作

this.Style = new Style(GetType(), this.FindResource(typeof(System.Windows.Controls.Button)) as Style);