2

当我在 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没有效果了。

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

4

1 回答 1

3

MSDN页面:

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

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

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

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

于 2013-10-24T14:55:54.833 回答