使用UserControl进行WPF HitTesting

时间:2013-09-04 23:12:56

标签: .net wpf hittest

我有以下UIElement树分类:

<Canvas>
    <UserControl x:Name="A">
        <Ellipse ></Ellipse>
    </UserControl>
    <UserControl x:Name="B">
        <Ellipse></Ellipse>
    </UserControl>
    <UserControl x:Name="C">
        <Ellipse></Ellipse>
    </UserControl>
</Canvas>

目前,Ellipses Height和Width占据了整个画布,但它们的背景是透明的。椭圆可以在屏幕上拖动。我想做的是执行HitTest,

  1. 当一个点击发生时,可以独立识别椭圆。

  2. 椭圆可以自由拖动(这就是高度/宽度占据整个画布的原因)。

  3. 我读过HitTest文档,但我仍然感到困惑。有人可以请我就完成上述任务提供一些指导吗?在iOS中,它只是覆盖了pointInside:检查位置是否在UserControl的省略号内。

3 个答案:

答案 0 :(得分:2)

这是帮助您完成目标的链接。

http://social.msdn.microsoft.com/Forums/vstudio/en-US/3bbe949b-ca8a-4a6e-a4fb-a8d267e58931/moveable-imageitem

如果要识别单击的子项,可以将PreviewMouseDown放在父项上,并检查子项的e.OriginalSource。如果要覆盖控件,则可以覆盖Previewmousedown函数以了解单击的子项。

答案 1 :(得分:0)

因此,如果有人遇到同样的问题,我最终在NULL和透明之间切换背景。这是一种黑客行为,但WPF路由(是的,我会讨厌)是一个巨大的麻烦。我可能会在以后遇到性能问题(可能没有),但我可以避免遍历树。

答案 2 :(得分:0)

这有帮助吗?

void UserControl_PreviewMouseDown(object sender, MouseButtonEventArgs e) {
    ...
    if (VisualTreeHelper.HitTest(ellipse, e.GetPosition(ellipse)) != null) {
        // mouse is within ellipse
    }
}

顺便说一下,UserControl可能会给你带来麻烦。看看它在这里的作用的解释:

http://books.google.ca/books?id=znAVMHNSen0C&pg=PA518&lpg=PA518&dq=%22taking+a+closer+look+at+user+controls%22&source=bl&ots=DjZT-9JCQd&sig=R4MoAzW72PaHvqgZjxPnkkJRs6c&hl=en&sa=X&ei=OdQIUrPgDeTYyAGl6oHYAQ&ved=0CC8Q6AEwAQ#v=onepage&q=%22taking%20a%20closer%20look%20at%20user%20controls%22&f=false

  

UserControl类更改路由事件的来源。什么时候发生   从用户控件内的控件到元素的气泡或隧道   在用户控件之外,源更改为指向用户   控制而不是原始元素。这会给你更多   封装。 (例如,如果你处理   保存的布局容器中的UIElement.MouseLeftButtonDown事件   颜色选择器,当您单击矩形时,您将收到一个事件   内。但是,此事件的来源不是Rectangle   元素,但包含Rectangle的ColorPicker对象。如果你   创建与普通内容控件相同的颜色选择器,这个   事实并非如此 - 你可以截取你控制中的事件,   处理它,并重新加入它。)

此行为对UserControl是唯一的。基本上,它意味着将元素组合在一起,就像它们是单个元素一样。它的主要用例是使用XAML /“代码隐藏”二重奏创建派生控件。对于独立容器,最好使用普通的ContentControl