You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在父元素触发器中设置子元素属性: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:54:02