WPF样式层次结构

时间:2012-12-03 17:19:42

标签: wpf xaml wpf-controls

我创建了一个自定义控件ColorToggleButton,它继承了ToggleButton。在相应的.xaml文件中,for ColorToggleButton是通过TargetType和BasedOn ToggleButton特定的。

<Style TargetType="ctl:ColorToggleButton" BasedOn="{StaticResource {x:Type ToggleButton}}">

这很好用,但是如果我在窗口中使用x:Key应用另一种样式,就像在

中一样
<Style x:Key="SameContent"><Setter Property="Content" Value="Same Content" /></Style>
<ctl:ColorToggleButton Style={StaticResource SameContent} />
旧的风格似乎完全消失了,取而代之的是新风格。我可以通过使用BasedOn来解决问题

<Style x:Key="SameContent" BasedOn="{StaticResource {x:Type ctl:ColorToggleButton}}"><Setter Property="Content" Value="Same Content" /></Style>
<ctl:ColorToggleButton Style={StaticResource MyKey} />

但这对我来说似乎违反直觉,因为如果我将样式应用于普通的ToggleButton或其他一些默认控件,我就不会使用BasedOn属性。这是实现自己的控件的标准方法吗?我做了一件可怕的错事吗?

编辑:ColorToggleButton的静态构造函数如下:

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

1 个答案:

答案 0 :(得分:1)

在你的控件中,你是否提供了带有DefaultStyleKeyProperty覆盖的静态构造函数?

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