当定义的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