C# 防止在存在'时触发父事件;s还引发了子控件事件

C# 防止在存在'时触发父事件;s还引发了子控件事件,c#,wpf,mouseevent,C#,Wpf,Mouseevent,我不太确定如何命名它,但是,假设我在画布的中心有3个红色的矩形 如果我单击一个矩形,颜色将变为蓝色,如果我在画布中单击而不是矩形,则每个蓝色矩形将颜色切换回红色 我的问题是:如果我创建了2个MouseLeftButtonDown事件,每个事件用于矩形-s,另一个事件用于画布,那么如果我单击矩形,那么画布上的MouseLeftButtonDown事件也会在矩形事件之后触发 问题:如果存在同时单击的子控件,如何防止触发Canvas\u MouseLeftButtonDown(父控件)事件 谢谢 更新

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

如果我单击一个
矩形
,颜色将变为蓝色,如果我在
画布
中单击而不是
矩形
,则每个蓝色
矩形
将颜色切换回红色

我的问题是:如果我创建了2个
MouseLeftButtonDown
事件,每个事件用于
矩形
-s,另一个事件用于
画布
,那么如果我单击
矩形
,那么
画布上的MouseLeftButtonDown
事件也会在
矩形
事件之后触发

问题:如果存在同时单击的子控件,如何防止触发
Canvas\u MouseLeftButtonDown
(父控件)事件

谢谢

更新+代码:

这是
矩形
事件:

private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    //Change clicked rectangle color to blue
}
private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    //Change all Child rectangle color back to red
}
这是
Canvas
事件:

private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    //Change clicked rectangle color to blue
}
private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    //Change all Child rectangle color back to red
}
我在一句话中想要的是:如果“矩形”事件触发,“画布”事件被阻止触发

由于in方法代码与问题不太相关,因此我将其删除以使其看起来更简单。

您可以在
矩形.MouseLeftButtonDown
处理程序中设置为true

private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}
来自MSDN

标记已处理的事件将限制已路由事件对事件路由沿线的侦听器的可见性。该事件仍然会在路由的其余部分传递,但只有在AddHandler(RouteEvent、Delegate、Boolean)方法调用中专门添加了HandledEventsTo 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
   }

}