1

我有以下 UIElement 树分类:

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

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

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

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

我确实阅读了 HitTest 文档,但我仍然感到困惑。有人可以为我提供一些完成上述任务的指导吗?在 iOS 中,它只是简单地覆盖 pointInside: 以检查该位置是否在 UserControl 的椭圆内。

4

3 回答 3

2

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

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

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

于 2013-09-05T02:25:14.007 回答
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=OdQIUQYAHYPgDe =0CC8Q6AEwAQ#v=onepage&q=%22taking%20a%20closer%20look%20at%20user%20controls%22&f=false

UserControl 类更改路由事件的来源。当事件从用户控件内部的控件冒泡或隧道到用户控件外部的元素时,源将更改为指向用户控件而不是原始元素。这给了你更多的封装。(例如,如果您在包含颜色选择器的布局容器中处理 UIElement.MouseLeftButtonDown 事件,当您单击其中的 Rectangle 时,您将收到一个事件。但是,此事件的来源不是 Rectangle 元素,而是包含 Rectangle 的 ColorPicker 对象。如果您创建与普通内容控件相同的颜色选择器,则情况并非如此 - 由您来拦截控件中的事件,处理它并重新引发它。)

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

于 2013-09-05T20:41:58.137 回答
0

因此,如果有人遇到同样的问题,我最终会在 NULL 和透明之间切换背景。这是一种 hack,但 WPF 路由(是的,我会讨厌)是一个非常令人头疼的问题。稍后我可能会遇到性能问题(也许不会),但我能够避免遍历树。

于 2013-09-05T19:40:09.937 回答