gpt4 book ai didi

wpf - 何时需要覆盖 DefaultStyleKey?

转载 作者:行者123 更新时间:2023-12-02 04:20:35 25 4
gpt4 key购买 nike

我刚刚花了大约 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 中。

最佳答案

我猜你正在谈论这个:

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

每个控件都需要定义其默认模板的主题样式。 (最常见的是自定义控件,其在 Themes\Generic.xaml 下定义)。

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

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

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

So, for your question if your custom control is deriving from Control, you need to override it to provide default template of control. In case deriving from control whose default template is already defined then you can avoid overriding it. It will pick base control style.

<小时/>

这就是针对你的问题所说的

why did it work for solution A?

我怀疑你在你的某个地方定义了明确的样式解决方案 B 中缺少解决方案 A。解决方案 B 也没有由于没有覆盖元数据,因此还设置了主题样式。

关于wpf - 何时需要覆盖 DefaultStyleKey?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com