2017-02-24 2 views
1

カスタムコントロールの継承された依存プロパティの既定値を指定する方法を調査したので、悟りよりも混乱しました。私が見つけた何カスタムコントロールの継承プロパティの既定値の設定方法 - スタイル対DefaultInitializerとOverrideMetadataの比較

は基本的には次のとおりです。staticコンストラクタでOverrideMetadataを使用してWPF ControlTemplate: How to provide a default value for TemplateBinding?

  • :ベースの初期化子を使用してHow can I change the default value of an inherited dependency property?
  • DefaultInitializer上:How to set default value to CustomControl inherited?
  • Style Generic.xamlでの使用

    • 私は幸せになると思います私は可能性の一つしか知りませんでしたが、現在どのアプローチがどのような重大な欠点があるのか​​、通常の状況下でどのアプローチが最適かを疑問に思っています。

    答えて

    1

    カスタムコントロールを作成するときに、抽象モデル(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> 
    
    +1

    フレームワークコントロールから派生したとき、私は自由に異なる値のオーバーライドを選ぶことができます。しかし、私のカスタムコントロールを再びサブクラス化するとどうなるでしょう...私はそれをテストしなければなりませんが、おそらくこの場合、親の 'Style'のデフォルトは必ずしもそこでは考慮されないので、' OverrideMetadata'を使うのが妥当でしょうか? – grek40

    +0

    私はXAMLをそのまま使用し、派生コントロールのスタイルを '