在父元素触发器中设置子元素属性:Grid鼠标悬停时修改子Rectangle填充色
问题原因
你的代码存在两个核心错误导致效果不生效:
- Grid的Style触发器中直接设置
Rectangle.Fill属性无效:该属性不是Grid的有效属性,触发器无法定位到你定义的Rectangle控件 - 直接给Rectangle设置了本地
Fill="LightGray",WPF依赖属性优先级中本地值的优先级远高于Style触发器设置值,就算触发器触发也无法覆盖原有颜色
解决方案
这里提供两种常用实现方式,任选其一即可:
方案1:将触发器写在Rectangle的Style中
通过绑定父级Grid的IsMouseOver属性判断悬停状态,同时把默认填充色移到Style的Setter中:
<Grid Width="50" Height="50" Background="Green"> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Rectangle Grid.Row="1"> <Rectangle.Style> <Style TargetType="{x:Type Rectangle}"> <!-- 默认填充色写到Style Setter里,保证触发器可以覆盖 --> <Setter Property="Fill" Value="LightGray"/> <Style.Triggers> <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Grid}}" Value="True"> <Setter Property="Fill" Value="Red"/> </DataTrigger> </Style.Triggers> </Style> </Rectangle.Style> </Rectangle> </Grid>
方案2:在Grid的触发器中通过控件名指定目标
给Rectangle设置x:Name,直接在Grid的触发器集合中通过TargetName定位目标控件:
<Grid Width="50" Height="50" Background="Green"> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="TargetRect" Property="Fill" Value="Red"/> </Trigger> </Grid.Triggers> <Rectangle x:Name="TargetRect" Grid.Row="1" Fill="LightGray" /> </Grid>
内容的提问来源于stack exchange,提问作者The Compiler
相关产品推荐
相关产品推荐

