我试图在Canvas上测试一堆UserControl。 我不希望HitTest()遍历整个可视化树,所以我使用FilterCallback来确保我只是命中测试UserControl。
我的问题是,用户控件永远不会打,它应该,但它不会。 如果我使用FilterCallback,则返回它没有任何结果。 如果让HitTest在可视化树中运行,它将跳过UserControl。
以下是一些代码:
<Canvas x:Name="Container"> <UserControl> <Grid> <Rectangle /> </Grid> </UserControl> <UserControl> <Grid> <Rectangle /> </Grid> </UserControl> </Canvas> ... VisualTreeHelper.HitTest(Container, OnFilter, OnResult, myPoint); ... private void OnResult(DependencyObject o) { //I'll get the Rectangle here, but never the userControl } private void OnFilter(DependencyObject o) { //I will get the UserControl here, but even when I do nothing more than continue, it will not trigger a visualHit. But the child rectangle will. }I'm trying to hit-test a bunch of UserControls on a Canvas. I don't want the HitTest() to walk the whole way through the visual tree, so I'm using the FilterCallback to make sure I only hit-test the UserControl.
My problem is that the UserControl never hits, it should, but it doesn't. If I use the FilterCallback, I return that it hit nothing. If I let the HitTest run through the visual tree, it skips the UserControl.
Here's some code:
<Canvas x:Name="Container"> <UserControl> <Grid> <Rectangle /> </Grid> </UserControl> <UserControl> <Grid> <Rectangle /> </Grid> </UserControl> </Canvas> ... VisualTreeHelper.HitTest(Container, OnFilter, OnResult, myPoint); ... private void OnResult(DependencyObject o) { //I'll get the Rectangle here, but never the userControl } private void OnFilter(DependencyObject o) { //I will get the UserControl here, but even when I do nothing more than continue, it will not trigger a visualHit. But the child rectangle will. }最满意答案
我有同样的HitTest问题找不到用户控件。 显然这是由设计( http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/005dad03-c8eb-405f-9567-50653a0e612c )。
我通过处理用户控件中某些元素的命中,然后使用VisualTreeHelper.GetParent方法查找父级用户控件来解决此问题。 我对WPF还不是很熟悉,所以我不确定使用FrameworkElement.Parent属性会更好。
但是,下面是我的方法,用于在通过命中测试首次查找其某些内容元素后,查找用户控件(或某些所需类型的任何可视父项):
public static T GetVisualParent<T>(this DependencyObject element) where T : DependencyObject { while (element != null && !(element is T)) element = VisualTreeHelper.GetParent(element); return (T)element; }I had this same problem of HitTest not finding a user control. Apparently this is by design (http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/005dad03-c8eb-405f-9567-50653a0e612c).
I worked around this by handling the hit of some element inside the user control, and then finding the parent user control using the VisualTreeHelper.GetParent method. I'm not very familiar with WPF yet, so I'm not sure if it would be better to use FrameworkElement.Parent property.
However, here is my method for finding the user control (or any visual parent of some required type) after first finding some of its content elements by hit test:
public static T GetVisualParent<T>(this DependencyObject element) where T : DependencyObject { while (element != null && !(element is T)) element = VisualTreeHelper.GetParent(element); return (T)element; }更多推荐
发布评论