カスタムコントロールを作成するときに、抽象モデル(class
)とその表現(Generic.xaml
)が明確に分離されています。いつものように、ビューをできるだけ愚かなものにしておく必要がありますが、同様に、表現レイヤーでの実装を保つこと(そしてモデルを乱雑にしないでください)が必要です。
私がクラスのデフォルト値をオーバーライドするために考えることができる唯一の理由は、初期化の順序が重要なときです。たとえば、継承されたデフォルト値が、クラスの初期化中に例外をスローする場合(Generic
スタイルはそれを "オーバーライド"できる前に)です。
一般的なXAML:これは、最も柔軟性の高い方法です。デフォルト実装の明確な図を提供します(editを参照)。
メソッドオーバーライド:前述のように、初期化の順序が重要な場合。よりクリーンなコードにつながります。
DefaultInitializer:VSデザイナーのデフォルト値を提供するために使用されます。ユーザがデザイン面にツールボックスからオブジェクトを追加するとき
DefaultInitializer拡張が呼び出されます。 DefaultInitializerクラスから派生して、オブジェクトのデフォルトの初期値を設定します。
EDIT - サブクラス化カスタムはこれがあなたに明確な概要を与え、関心事の分離が報わ別の領域である
を制御します。
<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>
フレームワークコントロールから派生したとき、私は自由に異なる値のオーバーライドを選ぶことができます。しかし、私のカスタムコントロールを再びサブクラス化するとどうなるでしょう...私はそれをテストしなければなりませんが、おそらくこの場合、親の 'Style'のデフォルトは必ずしもそこでは考慮されないので、' OverrideMetadata'を使うのが妥当でしょうか? – grek40
私はXAMLをそのまま使用し、派生コントロールのスタイルを '