如何识别线条的二次点击并实现颜色切换重置功能?
问题原因
你这段代码的问题在于每次触发MouseDown事件时,都会创建全新的SolidColorBrush实例。C#中引用类型的==比较的是对象引用而非内容,所以line.Stroke == selectionBrush永远为false——因为每次的selectionBrush都是新对象,和之前设置的Stroke引用完全不同,导致永远只会执行else分支,无法切回黑色。
解决方法
有两种简单的修复方式:
方式一:复用Brush实例(推荐)
将两个Brush定义为类的成员变量,避免每次创建新实例,保证引用一致,就能正确判断状态:
// 在类内部定义成员变量 private readonly SolidColorBrush _selectionBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF490AF6")); private readonly SolidColorBrush _blackBrush = new SolidColorBrush(Colors.Black); private void Line_MouseDown(object sender, MouseButtonEventArgs e) { Line line = (Line)sender; if (line.Stroke == _selectionBrush) { line.Stroke = _blackBrush; } else { line.Stroke = _selectionBrush; } }
方式二:比较Brush的Color属性
如果不想复用实例,也可以直接比较Brush的Color值,忽略引用差异:
private void Line_MouseDown(object sender, MouseButtonEventArgs e) { Color selectionColor = (Color)ColorConverter.ConvertFromString("#FF490AF6"); SolidColorBrush selectionBrush = new SolidColorBrush(selectionColor); SolidColorBrush blackBrush = new SolidColorBrush(Colors.Black); Line line = (Line)sender; // 比较Color属性而非对象引用 if (line.Stroke is SolidColorBrush brush && brush.Color == selectionColor) { line.Stroke = blackBrush; } else { line.Stroke = selectionBrush; } }
注意:方式二每次创建新Brush会带来微小的性能开销,如果频繁点击线条,推荐使用方式一。
内容的提问来源于stack exchange,提问作者user20276370
相关产品推荐
相关产品推荐

