什么时候需要覆盖DefaultStyleKey?

时间:2014-02-09 11:40:00

标签: wpf custom-controls

我花了2个小时试图弄清楚为什么在将控件从解决方案A移动到解决方案B(以及它的样式)后,控件停止显示(控件模板未应用)。原来我忘了覆盖默认样式键。这是一个问题:为什么它适用于解决方案A?

在DesignerView.cs中:

 public class DesignerView : Control {
     // No DefaultStyleKeyProperty.OverrideMetadata here
 }

在Generic.xaml中:

<Style TargetType="{x:Type controls:DesignerView}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:DesignerView}">
                <TextBlock Text="Hello" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

当然,我的风格比这复杂一点,但无论如何:完全相同的控件(类+样式,没有正确的DefaultStyleKeyProperty集)确实出现在解决方案A中,但在解决方案B中没有出现

1 个答案:

答案 0 :(得分:8)

我猜你在说这个:

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

每个控件都需要主题样式来定义其默认模板。 (通常用于Themes\Generic.xaml下定义的自定义控件。

DefaultStyleKeyProperty 定义用于查找控件主题样式的键。如果你注释掉这一行,它将选择基类的默认模板,通常类型为Control。 (但由于Control没有为其定义任何默认模板,因此当您注释掉此行时,您的控件不会显示

因此,需要在静态构造函数 中覆盖defaultStyleKeyProperty元数据,以指示其默认样式在Themes \ Generic.xaml 下声明。

如果您将基类更改为Button并注释掉此行,您将看到它选择Button类的默认模板。

  

因此,对于您的问题,您的自定义控件是否来自   控制,您需要覆盖它以提供默认的控制模板。如果来自控制   其默认模板已定义,您可以避免   压倒它。它会选择基本控制风格。


对你的问题说了

  

为什么它适用于解决方案A?

我怀疑你已经在你的某个地方定义了一个明确的风格 解决方案A在解决方案B中缺失。而解决方案B则没有 也设置了主题样式,因为没有覆盖元数据。