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

时间:2017-02-24 09:47:09

标签: wpf custom-controls

当我研究在自定义控件上为继承的依赖项属性指定默认值的方法时,我最终比开明更困惑。

我发现的基本上是:

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

1 个答案:

答案 0 :(得分:1)

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

我可以考虑覆盖类中默认值的唯一原因是初始化顺序很重要。例如,如果继承的默认值在类初始化期间抛出异常(在Generic样式之前可以“覆盖”它)。

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

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

  • DefaultInitializer:用于为VS设计器提供默认值。

  

当用户将工具箱中的对象添加到设计图面时,将调用DefaultInitializer扩展。   派生自DefaultInitializer类以配置对象的默认初始值。

编辑 - 子类化自定义控件

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

<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>