当还有Child控件事件被触发时,防止触发父事件

时间:2014-06-12 12:06:48

标签: c# wpf mouseevent

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

如果我点击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
}

这是Canvas事件:

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

我想要的一句话:如果“矩形”事件触发,则会阻止“画布”事件触发。

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

1 个答案:

答案 0 :(得分:8)

您可以在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
   }

}