如何在自定义控件中为继承 属性 设置默认值 - Style vs DefaultInitializer vs OverrideMetadata

How to set default value for inherited property in custom control - Style vs DefaultInitializer vs OverrideMetadata

当我研究为自定义控件上的继承依赖属性指定默认值的方法时,我最终感到困惑多于开悟。

我查到的基本上是:

我想如果我只知道其中一种可能性我会很高兴,但现在我想知道在正常情况下哪种方法最合适/这些方法是否有明显的缺点。

在构建自定义控件时,抽象模型 (class) 及其表示 (Generic.xaml) 之间存在明显的分离。一如既往,我们应该让视图尽可能地愚蠢,但同样地,将实现保留在表示层中(而不是使模型混乱)也是值得的。

我能想到的覆盖 class 中的默认值的唯一原因是初始化顺序很重要。例如,如果继承的默认值会在 class 的初始化期间抛出异常(在 Generic 样式能够 "override" 之前)。

  • 通用 XAML:首选方法,这提供了最大的灵活性。提供默认实现的清晰图片(参见编辑)。

  • 方法覆盖:如前所述,初始化顺序很重要。导致代码不太干净。

  • DefaultInitializer:用于为VS designer提供默认值。

The DefaultInitializer extension is invoked when the user adds an object from the Toolbox to the design surface. Derive from the DefaultInitializer class to configure default initial values for your object.

编辑 - 子classing 自定义控件

这是关注点分离带来回报的另一个领域,为您提供清晰的概览。

<Style TargetType="{x:Type local:MyButtonBase}">
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>

<Style BasedOn="{StaticResource {x:Type local:MyButtonBase}}"
       TargetType="{x:Type local:MyButton}">
    <!--Override inherited default value-->
    <Setter Property="FontSize" Value="18"/>
    <!--Add default values-->
    <Setter Property="IsDefault" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyButton}">

                ...

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>