2013-10-24 36 views
2

當我Visual Studio創建一個靜態構造函數被自動添加自定義控制:風格:支持算法FMP和DefaultStyleKeyProperty.OverrideMetadata

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

樣式

<Style TargetType="{x:Type c:MyListBoxItem}"> 
    <Style.Resources> 
    <!--SelectedItem with focus--> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" /> 
</Style.Resources> 
</Style> 

然後給出一個空的佈局。沒有靜態構造函數中的代碼,佈局是正確的。只要你沒有設置OverridesDefaultStyle爲真。

當我將BasedOn="{StaticResource {x:Type ListBoxItem}}"添加到樣式時,佈局在帶和不帶靜態構造函數代碼的情況下都是正確的。 OverridesDefaultStyle已無效。

我更喜歡自定義控件的樣式默認爲基類型的樣式。 它看起來好像靜態構造函數中的代碼可以省略。
但爲什麼然後它默認生成?

+0

如果再看一下'DefaultStyleKeyProperty.OverrideMetadata'方法中的參數,就會發現沒有提及'ListBoxItem' ......所有代碼都說的是你在那裏提供的'Style'應該是'MyListBoxItem'類型的對象的默認'Style'。 – Sheridan

+0

'DefaultStyleKey'代碼設置一個StyleKey,據我所知,不是一個Style?所以我想知道爲什麼帶有這個隱式類型鍵的樣式沒有被應用。 – Gerard

+0

你是正確的,'StyleKey'實際上不是一個'Style',但它涉及'Style',或*是'Style'的引用,據我所知。該行代碼仍然用於告訴'Framework'在'generic.xaml'中查看''Style''作爲控件的默認'Style'。我不確定它爲什麼不起作用。這是一個有趣的問題,但不幸的是,我目前無法測試你的情況......我會盡量在以後回家。 – Sheridan

回答

3

MSDN頁:

控制通常覆蓋此屬性的默認值是它自己的類型,但在某些情況下也可以使用它在主題詞典中的樣式存在一個基本類型。這隻有在基本控件的控件模板完全定義了派生控件的可視化表示以及派生類型公開的其他成員不需要額外元素作爲控件模板的一部分時纔是實用的。

在您的情況下,您希望您的自定義控件默認使用基本控件樣式。要達到這個目的,要麼必須從靜態構造函數中刪除該行,要麼將其替換爲以下行以指示您想要使用基本控件樣式。

DefaultStyleKeyProperty.OverrideMetadata(typeof(MyListBoxItem), new FrameworkPropertyMetadata(typeof(ListBoxItem))); 

我想,從靜態構造函數中刪除該行會更好。

+0

這是一種可能性。沒有OverrideMetadata並且默認樣式中沒有BasedOn也可以。 – Gerard

相關問題