當定義的wpf多個樣式,其樣式內容(屬性、觸發器等)有較多的重復時,可以考慮將其抽象成父樣式,來提升樣式代碼的可維護性以及減少代碼冗余。
wpf 進行樣式繼承時,需要使用style的BasedOn屬性。msdn的介紹參見:https://msdn.microsoft.com/en- us/library/system.windows.style.basedon(v=vs.110).aspx
下面介紹一個樣式繼承的簡單場景,並附以代碼示例。
- 場景簡介。假設系統中要求按鈕的字體需全部為黑體,14號,文字色為藍色。后來項目經理要求在按鈕樣式的基礎上,增加右靠齊的按鈕。
很明顯,系統中要存在兩種樣式的按鈕,出去文字靠齊方式之外,其他樣式全部相同,用按鈕樣式的繼承來解決這個問題就非常合適了。
- 1 思路:可以設計3中按鈕的樣式
- ButtonBaseStyle。按鈕樣式的基類
- DefaultButtonStyle。默認的按鈕樣式。【注】若要運用全局樣式,則style不能設置x:Keyshuxing。
- ContentPadLefButtonStyle。內容右靠齊的按鈕樣式。
- 2 代碼
- 在項目中添加資源字典文件,命名為ButtonAssets.xaml
- 在資源字典中新建ButtonBaseStyle樣式
-
<Style x:Key="ButtonBaseStyle" TargetType="Button"> <Setter Property="FontWeight" Value="Bold"></Setter> <Setter Property="FontSize" Value="14"></Setter> <Setter Property="Foreground" Value="Blue"></Setter> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> </Style>
- 使用樣式繼承,新建默認樣式
<Style TargetType="Button" BasedOn="{StaticResource ButtonBaseStyle}"></Style>
- 使用樣式繼承,新建右靠齊樣式
<Style x:Key="ContentPadLefButtonStyle" TargetType="Button" BasedOn="{StaticResource ButtonBaseStyle}"> <Setter Property="HorizontalContentAlignment" Value="Right"/> </Style>
- 在工程的App.xaml中引用資源字典
<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/TextBlockBasedOnStyle;component/ButtonAssets.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>
- 創建不同的按鈕,引用樣式。默認樣式按鈕,無需引用默認樣式,程序在運行時,會附加DefaultButtonStyle
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="5*"/> <ColumnDefinition Width="5*"/> </Grid.ColumnDefinitions> <Button Width="100" Content="默認樣式" Height="40"></Button>
<Button Style="{StaticResource ContentPadLefButtonStyle}" Content="右靠齊樣式" Width="100" Height="40" Grid.Column="1"></Button> </Grid>
- 程序執行結果
- 程序代碼:http://files.cnblogs.com/files/TaiYangXiManYouZhe/TextBlockBasedOnStyle.rar