为什么 DefaultStyleKey 不更改我的子类的默认样式?

Mar*_*eIV 3 c# wpf default

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

以下是 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

还有风格...

<Style TargetType="{x:Type annotations:Handle}">
    <Setter Property="Stroke" Value="Red" />
</Style>
Run Code Online (Sandbox Code Playgroud)

再说一遍,这是行不通的。

我的解决方法是基于第一个样式创建另外两种样式,但我认为这就是该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}}" />
Run Code Online (Sandbox Code Playgroud)

Mar*_*eIV 5

我想到了。该DefaultStyleKey属性仅引用在 themeGeneric.xamlThemes 下定义的样式。如果我把我的Handle风格转移到那里,突然之间,它就会起作用。如果我将其复制到本地窗口(我已经这样做了),则不会。有趣的是,查找是不同的。