如何在RadioButton的IsChecked为True时为其及文本添加边框?
问题原因分析
- Style.Trigger无效:自定义
ControlTemplate后,RadioButton的BorderThickness、BorderBrush属性没有在模板内的可视化元素上做绑定,因此Style层面的触发器无法作用到界面元素上。 - ControlTemplate设置Grid/TextBlock报错:
Grid和TextBlock本身没有BorderThickness和BorderBrush属性,直接给这两个控件设置这类属性会触发“参数未被识别”的错误。
解决方案
通过在ControlTemplate中添加带边框的Border控件,分别实现控件整体和文本的边框效果,再通过触发器控制边框状态:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style BasedOn="{StaticResource {x:Type ToggleButton}}" TargetType="{x:Type RadioButton}" x:Key="MenuButtonTheme"> <Style.Setters> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RadioButton}"> <!-- 外层Border实现控件整体边框 --> <Border x:Name="OuterBorder" BorderThickness="0" BorderBrush="Transparent" Background="{TemplateBinding Background}"> <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" x:Name="GridMain"> <!-- 内层Border实现文本边框 --> <Border x:Name="TextBorder" BorderThickness="0" BorderBrush="Transparent"> <TextBlock Text="{TemplateBinding Content}" x:Name="ButtonText" VerticalAlignment="Center" Margin="20,0,0,0"> </TextBlock> </Border> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter TargetName="ButtonText" Property="Margin" Value="30,0,0,0"/> <!-- 开启控件整体边框 --> <Setter TargetName="OuterBorder" Property="BorderThickness" Value="5"/> <Setter TargetName="OuterBorder" Property="BorderBrush" Value="#7289da"/> <!-- 开启文本边框 --> <Setter TargetName="TextBorder" Property="BorderThickness" Value="1"/> <Setter TargetName="TextBorder" Property="BorderBrush" Value="#7289da"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="GridMain" Property="Background" Value="#424549"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <Setter Property="Background" Value="Transparent"/> </Style.Setters> </Style> </ResourceDictionary>
修改说明
- 新增两个
Border控件:OuterBorder包裹整个Grid,负责控件整体的边框;TextBorder包裹TextBlock,负责文本区域的边框。 - 在
IsChecked=True的触发器中,直接修改两个Border的边框属性,替代原来无效的Grid/TextBlock属性设置。 - 移除原
Style.Triggers,所有视觉状态控制统一在ControlTemplate.Triggers中完成,逻辑更直接。
内容的提问来源于stack exchange,提问作者RickStead
相关产品推荐
相关产品推荐

