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

WPF中修改矩形填充HEX颜色值无响应问题求助

问题原因与解决方法

这个坑我之前踩过!你代码没效果的核心原因是直接比较SolidColorBrush对象的引用——每次调用BrushConverter.ConvertFromString()都会生成一个全新的SolidColorBrush实例,哪怕颜色值完全一样,两个实例的引用也不相等,所以==判断永远返回false,自然不会触发颜色切换逻辑。

下面给你几个可行的修复方案,按从简单到优雅的顺序排列:

方案1:复用同一个Brush对象(最直接)

提前定义好两个颜色刷的静态实例,避免每次都新建对象,这样就能通过引用比较判断当前颜色:

// 提前在类里定义静态字段,避免重复创建
private static readonly SolidColorBrush _color1 = (SolidColorBrush)new BrushConverter().ConvertFromString("#95305D");
private static readonly SolidColorBrush _color2 = (SolidColorBrush)new BrushConverter().ConvertFromString("#3E7A61");

public void Rect_Click(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    if (RMaximize.Fill == _color1)
        RMaximize.Fill = _color2;
    else
        RMaximize.Fill = _color1;
}

方案2:比较颜色值而非Brush对象

如果不想预定义静态实例,可以直接比较Brush的Color属性值,这是值类型比较,不会受对象引用影响:

public void Rect_Click(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    var color1 = (Color)ColorConverter.ConvertFromString("#95305D");
    var color2 = (Color)ColorConverter.ConvertFromString("#3E7A61");
    
    // 先做类型检查,避免空引用或类型转换异常
    if (RMaximize.Fill is SolidColorBrush currentBrush)
    {
        RMaximize.Fill = currentBrush.Color == color1 
            ? new SolidColorBrush(color2) 
            : new SolidColorBrush(color1);
    }
}

方案3:纯XAML实现(更符合WPF思想)

如果想摆脱后台代码,用WPF的触发器/ToggleButton就能实现点击切换效果,更优雅:

<ToggleButton x:Name="MaximizeToggle" BorderThickness="0" Background="Transparent">
    <ToggleButton.Template>
        <ControlTemplate TargetType="ToggleButton">
            <Rectangle x:Name="RMaximize" Fill="#95305D" Width="20" Height="20"/>
            <ControlTemplate.Triggers>
                <!-- 选中状态切换颜色 -->
                <Trigger Property="IsChecked" Value="True">
                    <Setter TargetName="RMaximize" Property="Fill" Value="#3E7A61"/>
                </Trigger>
                <!-- 可选:添加鼠标悬停效果 -->
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter TargetName="RMaximize" Property="Opacity" Value="0.8"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </ToggleButton.Template>
</ToggleButton>

这种方式完全不需要后台代码,点击矩形就能自动切换颜色,再次点击切回原色。

内容的提问来源于stack exchange,提问作者Sen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:37:24