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

时间:2015-10-05 19:06:11

标签: c# wpf default

我有一个名为Handle的基类,我可以从中导出几个基类,例如RectHandleEllipseHandle。在这些子类中,我尝试覆盖默认样式键以指向Handle,但未应用定位Handle的样式。我仍然需要直接明确定位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}}" />

1 个答案:

答案 0 :(得分:4)

我明白了。 DefaultStyleKey属性 仅指主题中定义的样式 ,或主题下的Generic.xaml。如果我在那里移动我的Handle样式,突然之间就可以了。如果我把它本地复制到窗口,我已经完成了,它没有。有趣的是查找不同。