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