不同目标类型间的样式继承:WPF圆角按钮样式如何复用?
解决方案
你不需要重写ControlTemplate,利用WPF样式的独立资源作用域特性即可实现需求,不会出现样式冲突问题,最终代码量和你预期的基本一致:
<!-- 提前定义全局共用颜色资源 --> <SolidColorBrush x:Key="MainBlue" Color="#0078D4"/> <SolidColorBrush x:Key="LightBlue" Color="#4A90E2"/> <Style x:Key="WhiteOnBlueButton" TargetType="Button"> <Setter Property="Background" Value="{StaticResource MainBlue}" /> <Setter Property="Foreground" Value="White" /> <Setter Property="FontWeight" Value="Bold" /> <!-- 仅在当前按钮样式内生效的Border样式,不会和其他样式冲突 --> <Style.Resources> <Style TargetType="Border"> <Setter Property="CornerRadius" Value="4"/> <Setter Property="BorderThickness" Value="0" /> </Style> </Style.Resources> </Style> <Style x:Key="BlueOnWhiteButton" TargetType="Button"> <Setter Property="Background" Value="White" /> <Setter Property="Foreground" Value="{StaticResource MainBlue}" /> <Setter Property="FontWeight" Value="Bold" /> <!-- 仅在当前按钮样式内生效的Border样式 --> <Style.Resources> <Style TargetType="Border"> <Setter Property="CornerRadius" Value="4"/> <Setter Property="BorderBrush" Value="{StaticResource LightBlue}" /> <Setter Property="BorderThickness" Value="2" /> </Style> </Style.Resources> </Style>
报错原因说明
你之前遇到的Style.Resources重复定义报错,是因为你把Border的隐式样式写在了全局资源层级,而不是每个按钮样式的<Style.Resources>节点下。每个按钮样式的内部资源是独立作用域,互不干扰,完全可以单独定义各自的Border样式。
最终使用方式
和你预期的完全一致,不需要额外修改调用代码:
<Button Style="{DynamicResource WhiteOnBlueButton}" Content="CLICK ME!" /> <Button Style="{DynamicResource BlueOnWhiteButton}" Content="ANOTHER BUTTON" />
内容的提问来源于stack exchange,提问作者Mathieu L'Ecuyer-Turcotte
相关产品推荐
相关产品推荐

