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
相关产品推荐
相关产品推荐

