我花了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中没有出现
答案 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则没有 也设置了主题样式,因为没有覆盖元数据。