2

我有我的 XAML 代码:

<Canvas x:Name="mainCanvas" Width="200" Height="150" Background="LightGray"
        MouseLeftButtonUp="mainCanvas_MouseLeftButtonUp"
        MouseMove="mainCanvas_MouseMove">
    <Canvas x:Name="topCanvas" Width="200" Height="100" Background="LightBlue"
            MouseLeftButtonUp="topCanvas_MouseLeftButtonUp"
            MouseMove="topCanvas_MouseMove">
    </Canvas>
</Canvas>

及其背后的代码:

private void topCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("topCanvas_MouseLeftButtonUp");

    e.Handled = true; // This can prevent routing to the mainCanvas
}

private void mainCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("mainCanvas_MouseLeftButtonUp");
}

private void topCanvas_MouseMove(object sender, MouseEventArgs e)
{
    Debug.WriteLine("topCanvas_MouseMove");

    // How to prevent routing to the mainCanvas?
    // e.Handled = true does NOT exist in MouseEventArgs
}

private void mainCanvas_MouseMove(object sender, MouseEventArgs e)
{
    Debug.WriteLine("mainCanvas_MouseMove");
}

我的问题已经在评论中了。

如何防止将 MouseMove 事件从 topCanvas(子画布)路由到 mainCanvas(父画布)?

谢谢。

彼得

4

3 回答 3

0

尝试设置 Canvas 的 IsHitTestVisible 属性。通过相应地设置该属性,鼠标事件将“通过”您的控件或被它捕获。

希望这是你需要的。

于 2012-01-16T06:44:19.603 回答
0

您可以尝试比较 mainCanvas 的 MouseMove 事件中的 e.OriginalSource,如果它不是源自 mainCanvas,则退出 Sub。

private void mainCanvas_MouseMove(object sender, MouseEventArgs e)
{
    if (sender != e.OriginalSource)
        return;        
}

在更详细地回复您的评论时。根据UIElement.MouseMove事件 MSDN 链接。

继承 MouseMove 的控件可以通过重写 OnMouseMove 方法为充当所有实例的处理程序的事件提供处理。与直接处理事件一样,没有可用的 Handled 属性,因此 OnMouseMove 不能以抑制通过 Handled 技术进一步处理事件的方式实现。

这个链接指出:

此事件为此类的 Mouse.MouseMove 附加事件创建别名

这将我们带到了AttachedEvents上的这个链接。

可扩展应用程序标记语言 (XAML) 定义了一种语言组件和称为附加事件的事件类型。附加事件的概念使您能够将特定事件的处理程序添加到任意元素,而不是添加到实际定义或继承事件的元素。在这种情况下,可能引发事件的对象和目标处理实例都没有定义或以其他方式“拥有”事件。

因此,在我看来,您唯一的选择是围绕它进行编码。

于 2012-01-16T06:34:39.160 回答
-2

该功能称为“事件冒泡”。您可以使用以下代码停止它:

jQuery: event.stopPropagation(); 参考:http ://api.jquery.com/event.stopPropagation/

您也可以尝试以下代码: e.stopPropagation(); //防止事件冒泡 e.preventDefault(); //然后取消事件(如果它是可取消的)

Ref: http://stackoverflow.com/questions/1967537/how-to-stop-event-bubbling-with-jquery-live

谢谢,拉维维尔马

于 2012-01-16T05:54:49.230 回答