我有以下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,
当一个点击发生时,可以独立识别椭圆。
椭圆可以自由拖动(这就是高度/宽度占据整个画布的原因)。
我读过HitTest文档,但我仍然感到困惑。有人可以请我就完成上述任务提供一些指导吗?在iOS中,它只是覆盖了pointInside:检查位置是否在UserControl的省略号内。
答案 0 :(得分:2)
这是帮助您完成目标的链接。
如果要识别单击的子项,可以将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
可能会给你带来麻烦。看看它在这里的作用的解释:
UserControl类更改路由事件的来源。什么时候发生 从用户控件内的控件到元素的气泡或隧道 在用户控件之外,源更改为指向用户 控制而不是原始元素。这会给你更多 封装。 (例如,如果你处理 保存的布局容器中的UIElement.MouseLeftButtonDown事件 颜色选择器,当您单击矩形时,您将收到一个事件 内。但是,此事件的来源不是Rectangle 元素,但包含Rectangle的ColorPicker对象。如果你 创建与普通内容控件相同的颜色选择器,这个 事实并非如此 - 你可以截取你控制中的事件, 处理它,并重新加入它。)
此行为对UserControl
是唯一的。基本上,它意味着将元素组合在一起,就像它们是单个元素一样。它的主要用例是使用XAML /“代码隐藏”二重奏创建派生控件。对于独立容器,最好使用普通的ContentControl。