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

标签 c# wpf default

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

这是 DefaultStyleKeyProperty 的 MSDN 摘录:

A control typically overrides the default value of this property to be its own type, but in some cases could also use a base type for which a style in the theme dictionaries exists.

这是我的代码

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}}" />

最佳答案

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

关于c# - 为什么 DefaultStyleKey 不更改我的子类的默认样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32956005/

相关文章:

c# - LINQ 嵌套组性能

c# - 如何清除我使用过一次的 WCF HTTP 客户端的 PooledBufferManager?

c# - 沿圆形路径创建渐变画笔

wpf - 当已经是英国时,日期选择器格式化为英国格式

c++ - switch 语句 C++ [默认部分]

macos - 如何让 Atom 成为我的默认编辑器?

c# - 使用相关/派生的 Ts 在泛型中进行转换

c# - 启动 IIS Express 时发生错误 - Visual Studio 2017

wpf - 依赖属性 SetValue() 和 SetCurrentValue() 之间有什么区别

generics - Dart 对几种类型的通用约束并设置默认值