当我研究在自定义控件上为继承的依赖项属性指定默认值的方法时,我最终比开明更困惑。
我发现的基本上是:
Style
中的Generic.xaml
:WPF ControlTemplate: How to provide a default value for TemplateBinding? OverrideMetadata
构造函数中使用static
:How can I change the default value of an inherited dependency property? DefaultInitializer
的初始值设定项:How to set default value to CustomControl inherited? 如果我只知道其中一种可能性,我想我会很高兴,但现在我想知道哪种方法在正常情况下是最合适的/这些方法是否有明显的缺点。
答案 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>