.net 使用UserControl进行WPF测试
我有以下UIElement树分类法:.net 使用UserControl进行WPF测试,.net,wpf,hittest,.net,Wpf,Hittest,我有以下UIElement树分类法: <Canvas> <UserControl x:Name="A"> <Ellipse ></Ellipse> </UserControl> <UserControl x:Name="B"> <Ellipse></Ellipse> </UserControl> <UserCon
<Canvas>
<UserControl x:Name="A">
<Ellipse ></Ellipse>
</UserControl>
<UserControl x:Name="B">
<Ellipse></Ellipse>
</UserControl>
<UserControl x:Name="C">
<Ellipse></Ellipse>
</UserControl>
</Canvas>
目前,椭圆的高度和宽度占据整个画布,但其背景是透明的。椭圆可以在屏幕上拖动。我想做的是执行命中测试,以便
我确实阅读了HitTest文档,但我仍然感到困惑。有人能为我提供一些完成上述任务的指导吗?在iOS中,它只是覆盖pointInside:检查位置是否在UserControl上的省略号内 以下链接可帮助您完成您想要完成的任务
如果要确定单击了哪些子项,可以将PreviewMouse放在父项上,并检查e.OriginalSource中的子项。如果要覆盖控件,则可以覆盖Previewmousedown函数,以了解单击了哪些子项。因此,如果有人遇到相同的问题,我将在NULL和透明之间切换背景。这是一种黑客行为,但WPF路由(是的,我很讨厌)是一个非常头痛的问题。我以后可能会遇到性能问题(可能不会),但我可以避免遍历树。这有帮助吗
void UserControl_PreviewMouseDown(object sender, MouseButtonEventArgs e) {
...
if (VisualTreeHelper.HitTest(ellipse, e.GetPosition(ellipse)) != null) {
// mouse is within ellipse
}
}
顺便说一下,
UserControl
可能会给您带来麻烦。请看下面的解释:
UserControl类更改路由事件的源。当事件发生时
从用户控件内部的控件到元素的气泡或通道
在用户控件之外,源更改为指向用户
控件而不是原始元素。这会给你更多
封装。(例如,如果您处理
保存的布局容器中的UIElement.MouseLeftButtonDown事件
在颜色选择器中,单击矩形时将收到一个事件
但是,此事件的源不会是矩形
元素,但包含矩形的ColorPicker对象。如果
创建与普通内容控件相同的颜色选择器,如下所示
是不是由你来拦截你控制的事件,
处理它,然后重新提升它。)
此行为是
UserControl
独有的。基本上,这意味着将元素分组在一起,就像它们是单个元素一样。它的主要用例是使用XAML/“代码隐藏”duo创建派生控件。对于独立容器,最好使用普通的。使用拇指控件。你不需要任何定制的HitTesting。我会看看Thumb控件,但是我的UserControl相当复杂。你能多了解一下那个控件的用法吗?