2015-12-03 26 views
0

让我们假设一个形状已经创建并添加到画布。事件处理程序可以添加比方说,一个鼠标左键向上事件是这样的:通过画布形状的气泡事件

System.Windows.Shapes.Rectangle r = new Rectangle(...); 
r += r_MouseLeftButtonUp; 
// Maybe other event handlers added... 
Canvas.Children.Add(r); 

所以这伟大工程。事件处理程序被触发,除非在与第一个形状重叠的同一个画布上创建另一个形状。有没有什么办法通过鼠标光标位置下的所有形状触发mouseLeftButtonUp事件?

回答

0

只要有一个可点击的部分可用于任何形状,重叠应该工作。如果这里的问题是关于由于其上的另一个形状而变得隐藏的形状(不再可点击),则可以使用Canvas调用处理程序。

<Canvas UIElement.MouseLeftButtonUp="Canvas_MouseLeftButtonUp"> 
    <Rectangle x:Name="rec1" Height="50" Width="50" Canvas.Left="0" Canvas.Top="0" Fill="Aqua"/> 
    <Rectangle x:Name="rec2" Height="50" Width="50" Canvas.Left="25" Canvas.Top="25" Fill="LightBlue"/> 
</Canvas> 

当您左键单击画布时,将设置EventHandler。我们可以在画布的每个Shape子项上调用处理程序。

private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
     Canvas c = sender as Canvas; 
     foreach (Rectangle r in c.Children) 
     { 
      // Invoke the handler here... 
     } 
    } 
+0

这种方法有两个问题。其一,我不想仅仅为矩形发射事件,而是为鼠标光标下的任何形状发射事件。椭圆,多段线,你的名字。二,我需要一个额外的如果每个形状来检查它是否在鼠标光标下。我想摆脱这种方法,因为它感觉沉重而且受阻。 – roymcclure

+0

长方形儿童的迭代只是一个概念。您可以获取鼠标坐标,并限制所击中和相交的呼叫。只要它是UIElement类型的,你可以将它应用于任何儿童。它看起来像你想在内部路由不是为同一个兄弟姐妹设计的路由事件 - 它需要一个工作或去自定义路由事件。 – tgpdyk