Silverlight:如何防止将MouseMove事件从子画布路由到其父画布

时间:2012-01-16 05:44:52

标签: silverlight events routing mousemove silverlightcontrols

我有我的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(父画布)?

感谢。

彼得

3 个答案:

答案 0 :(得分:0)

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

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

更详细地回复您的评论。根据{{​​3}}事件MSDN链接。

  

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

以及此UIElement.MouseMove个州:

  

此事件为Mouse.MouseMove附加事件创建别名   这个班级

这使我们看到link上的这个链接。

  

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

所以我看到它,你唯一的选择就是围绕它进行编码。

答案 1 :(得分:0)

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

希望这就是你所需要的。

答案 2 :(得分:-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

谢谢, Ravi Verma