触发Child控件事件时,防止触发父事件

Mos*_*ico 3 c# wpf mouseevent

我不太确定如何授权它,但是,我说我Rectangle的中心有3个红色Canvas.

如果我点击a Rectangle,颜色变为蓝色,如果我点击Canvas但不是Rectangle,则每个蓝色Rectangle开关颜色变回红色.

我的问题是这样的:如果我做了2个MouseLeftButtonDown事件,每个用于Rectangle-s而另一个用于Canvas,那么如果我点击它Rectangle,Canvas_MouseLeftButtonDown事件也会在Rectangle一个之后触发.

问题:Canvas_MouseLeftButtonDown如果有一个也单击的子控件,如何防止(父控件)事件被触发.

谢谢.

更新+代码:

这是Rectangle事件:

private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    //Change clicked rectangle color to blue
}
Run Code Online (Sandbox Code Playgroud)

这是Canvas事件:

private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    //Change all Child rectangle color back to red
}
Run Code Online (Sandbox Code Playgroud)

我想要的一句话:如果"矩形"事件触发,则禁止"画布"事件触发.

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

dko*_*ozl 10

您可以HandledRectangle.MouseLeftButtonDown处理程序中设置为true

private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)

来自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
   }

}
Run Code Online (Sandbox Code Playgroud)