样式:BasedOn和DefaultStyleKeyProperty.OverrideMetadata

时间:2013-10-24 14:02:44

标签: c# wpf styles custom-controls

当我在Visual Studio中创建自定义控件时,会自动添加静态构造函数:

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设置为true。

当我向样式添加BasedOn="{StaticResource {x:Type ListBoxItem}}"时,无论使用和不使用静态构造函数代码,布局都是正确的。 OverridesDefaultStyle已不再有效。

我希望自定义控件的样式默认为基本类型的样式。 它看起来好像可以省略静态构造函数中的代码 但是为什么它会默认生成呢?

1 个答案:

答案 0 :(得分:3)

来自MSDN页面:

  

控件通常会将此属性的默认值覆盖为其自己的类型,但在某些情况下,还可以使用主题词典中存在样式的基本类型。这仅在基本控件的控件模板完全定义派生控件的可视表示时才有用,并且如果派生类型公开的任何其他成员不需要其他元素作为控件模板的一部分。

在您的情况下,您希望自定义控件默认使用基本控件样式。要实现这一点,您必须从静态构造函数中删除该行,或者使用以下行替换它以指示您要使用基本控件样式。

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

我想,从静态构造函数中删除该行会更好。