防止在子控件事件被触发时同时触发父控件事件。

5

我不太确定如何命名它,但是假设我在画布的中心有三个红色矩形

如果我点击一个矩形,颜色会变成蓝色,如果我在画布内但不是在矩形上单击,每个蓝色矩形都会切换回红色。

我的问题是:如果我为矩形画布分别创建两个MouseLeftButtonDown事件,那么如果我点击矩形Canvas_MouseLeftButtonDown事件也会在矩形事件之后触发。

问题:如何防止在子控件被单击时触发父控件的Canvas_MouseLeftButtonDown事件?

谢谢。

更新+代码:

这是矩形事件:

private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    //Change clicked rectangle color to blue
}

这是关于Canvas事件的内容:
private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    //Change all Child rectangle color back to red
}

我需要的是一句话:如果“rectangle”事件触发,则阻止“canvas”事件触发。 由于方法内的代码与问题不太相关,因此我将其删除以使其看起来更简单。
1个回答

13
你可以在Rectangle.MouseLeftButtonDown处理程序中将Handled设为true。
private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

来自 MSDN

标记事件已处理将限制路由事件的可见性,但事件仍会按照路由继续传递,但只有在 AddHandler(RoutedEvent, Delegate, Boolean) 方法调用中使用 HandledEventsToo 参数设置为 true 的处理程序才会响应该事件。

编辑

作为另一种解决方案,您可以仅保留 Canvas.MouseLeftButtonDown 事件处理程序,删除 Rectangle 的事件处理程序,然后执行以下操作:

private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
   if (e.OriginalSource is Rectangle)
   {
       var myRectangle = e.OriginalSource as Rectangle;
       //your code for Rectangle clicked
   }
   else if (e.OriginalSource is Canvas)
   {
       var myCanvas = e.OriginalSource as Canvas;
       //your code for Canvas clicked
   }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接