當我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
已無效。
我更喜歡自定義控件的樣式默認爲基類型的樣式。 它看起來好像靜態構造函數中的代碼可以省略。
但爲什麼然後它默認生成?
如果再看一下'DefaultStyleKeyProperty.OverrideMetadata'方法中的參數,就會發現沒有提及'ListBoxItem' ......所有代碼都說的是你在那裏提供的'Style'應該是'MyListBoxItem'類型的對象的默認'Style'。 – Sheridan
'DefaultStyleKey'代碼設置一個StyleKey,據我所知,不是一個Style?所以我想知道爲什麼帶有這個隱式類型鍵的樣式沒有被應用。 – Gerard
你是正確的,'StyleKey'實際上不是一個'Style',但它涉及'Style',或*是'Style'的引用,據我所知。該行代碼仍然用於告訴'Framework'在'generic.xaml'中查看''Style''作爲控件的默認'Style'。我不確定它爲什麼不起作用。這是一個有趣的問題,但不幸的是,我目前無法測試你的情況......我會盡量在以後回家。 – Sheridan