如何在XAML资源字典中引用RadioButton模板内的TextBlock设置触发器
要实现当RadioButton的IsChecked为True时修改内部TextBlock的左内边距,你需要把触发器放到ControlTemplate内部,同时给TextBlock指定x:Name来引用它。
修改后的完整代码如下:
<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="RadioButton"> <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="{TemplateBinding Background}"> <!-- 给TextBlock添加x:Name以便引用 --> <TextBlock x:Name="ContentTextBlock" Text="{TemplateBinding Property=Content}" VerticalAlignment="Center" Margin="20,0,0,0"> </TextBlock> </Grid> <!-- 在ControlTemplate内部添加触发器 --> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <!-- 通过TargetName引用TextBlock,修改它的Margin --> <Setter TargetName="ContentTextBlock" Property="Margin" Value="30,0,0,0"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <Setter Property="Background" Value="Transparent"></Setter> <Setter Property="BorderThickness" Value="0"></Setter> </Style.Setters> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="#424549"></Setter> </Trigger> </Style.Triggers> </Style> </ResourceDictionary>
关键修改说明:
- 给TextBlock添加
x:Name="ContentTextBlock",为模板内元素提供可引用的标识 - 把
IsChecked触发器从Style.Triggers迁移到ControlTemplate.Triggers,因为Style触发器无法访问模板内部的私有元素 - 在模板触发器的Setter中通过
TargetName="ContentTextBlock"指定目标元素,修改其Margin属性
内容的提问来源于stack exchange,提问作者RickStead
相关产品推荐
相关产品推荐

