2017-02-24 53 views
1

當我研究如何爲自定義控件上的繼承依賴項屬性指定默認值時,我最終變得比開明更困惑。如何在自定義控件中設置繼承屬性的默認值 - 樣式vs DefaultInitializer與OverrideMetadata

我發現什麼基本上是:

我想我會很開心如果我只知道其中一種可能性,但現在我想知道在正常情況下哪種方法最適合/是否存在任何方法的顯着缺點。

回答

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

一個想法超越了我的想法,但我還沒有完成:當從框架控件派生時,我可以自由選擇不同類型的值覆蓋,它適用於我所能告訴的所有人。但是如果我再次對自定義控件進行子類化,我必須對其進行測試,但是在這種情況下,可能會使用'OverrideMetadata',因爲來自父'Style'的默認值不一定會在那裏被考慮? – grek40

+0

我會保留它的XAML,並聲明派生控件的樣式爲 '