【问题标题】:Why doesn't DefaultStyleKey change the default style for my subclasses?为什么 DefaultStyleKey 不更改我的子类的默认样式?
【发布时间】:2015-10-05 19:06:10
【问题描述】:

我有一个名为Handle 的基类,从中派生出几个基类,例如RectHandleEllipseHandle。在这些子类中,我尝试覆盖默认样式键以指向Handle,但未应用以Handle 为目标的样式。我仍然必须直接或通过“BasedOn”样式明确定位RectHandleEllipseHandle。我错过了什么?

这是 DefaultStyleKeyProperty 的 MSDN 摘录:

控件通常会将此属性的默认值覆盖为自己的类型,但在某些情况下,也可以使用主题字典中存在样式的基本类型。

这是我的代码

public abstract class Handle : Shape
{
    static Handle()
    {
        WidthProperty.OverrideMetadata(
            typeof(Handle),
            new FrameworkPropertyMetadata(10.0));

        HeightProperty.OverrideMetadata(
            typeof(Handle),
            new FrameworkPropertyMetadata(10.0));

        FillProperty.OverrideMetadata(
            typeof(Handle),
            new FrameworkPropertyMetadata(Brushes.Yellow));

        StrokeProperty.OverrideMetadata(
            typeof(Handle),
            new FrameworkPropertyMetadata(Brushes.Gray));

        StrokeThicknessProperty.OverrideMetadata(
            typeof(Handle),
            new FrameworkPropertyMetadata(2.0));
    }
}

public class RectHandle : Handle
{
    static RectHandle()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(RectHandle),
            new FrameworkPropertyMetadata(typeof(Handle)));
    }

    protected override Geometry DefiningGeometry
    {
        get
        {
            var origin = new Point(-RenderSize.Width / 2, -RenderSize.Height / 2);
            var rect = new Rect(origin, RenderSize);
            return new RectangleGeometry(rect);
        }
    }
}

public class EllipseHandle : Handle
{
    static RectHandle()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(EllipseHandle),
            new FrameworkPropertyMetadata(typeof(Handle)));
    }

    protected override Geometry DefiningGeometry
    {
        get
        {
            var origin = new Point(-RenderSize.Width / 2, -RenderSize.Height / 2);
            var rect = new Rect(origin, RenderSize);
            return new EllipseGeometry(rect);
        }
    }
}

还有风格……

<Style TargetType="{x:Type annotations:Handle}">
    <Setter Property="Stroke" Value="Red" />
</Style>

同样,这不起作用。

我的解决方法是在第一个样式的基础上创建另外两个样式,但我认为这就是 DefaultStyleKey 属性的全部意义所在。

<Style TargetType="{x:Type annotations:Handle}">
    <Setter Property="Stroke" Value="Red" />
</Style>

<Style TargetType="{x:Type annotations:RectHandle}"
    BasedOn="{StaticResource {x:Type annotations:Handle}}" />

<Style TargetType="{x:Type annotations:EllipseHandle}"
    BasedOn="{StaticResource {x:Type annotations:Handle}}" />

【问题讨论】:

  • 你的解决方法是正确的
  • 我看到您删除了指向我的解决方案的原始评论。但这并没有解释明确设置 DefaultStyleKeyProperty 的元数据。如果不是这种情况,您的解决方案当然有效,但如果您设置它,则不需要“BasedOn”。

标签: c# wpf default


【解决方案1】:

我想通了。 DefaultStyleKey 属性仅指主题中定义的样式,或主题下Generic.xaml 中定义的样式。如果我将Handle 样式移到那里,突然之间,它就起作用了。如果我将其复制到本地的窗口,我已经完成了,它不会。有趣的是查找是不同的。

【讨论】:

    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2020-05-21
    • 2023-03-30
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多