HitTestResultCallback找不到UserControl

时间:2013-03-21 19:15:28

标签: c# wpf

我在尝试通过HitTestResultCallback访问UserControl时遇到了一些麻烦,我可以在我的UserControl中找到所有控件,但我想要做的是访问UserControl类,这是我的代码:

    public void DragStartInteraction()
    {
        VisualTreeHelper.HitTest(Application.Current.MainWindow, null, new HitTestResultCallback(myCallbackDragStartEvent), new PointHitTestParameters(_currentPoint));

        ...
    }

    private HitTestResultBehavior myCallbackDragStartEvent(HitTestResult result)
    {
        ...

        UserControl el = result.VisualHit as UserControl;

        ...

        return HitTestResultBehavior.Continue;
    }

谢谢!

1 个答案:

答案 0 :(得分:2)

HitTestResultCallback仅针对实际具有渲染内容的可视树中的视觉效果进行调用。例如,在Label控件中,回调将仅返回构成Label的Border和TextBlock,而不返回Label控件本身。您的UserControl也是如此。

您可以通过调用VisualTreeHelper.GetParent从传递给HitTestResultCallback的视觉效果中获取UserControl。

或者,您还提供HitTestFilterCallback。此回调获取可视树中的所有可视化,并且您可以在传入UserControl时停止遍历树。

VisualTreeHelper.HitTest(
    Application.Current.MainWindow,
    obj =>
    {
        if (obj is UserControl)
        {
            // found it
            return HitTestFilterBehavior.Stop;
        }
        return HitTestFilterBehavior.Continue;
    },
    result => HitTestResultBehavior.Continue,
    new PointHitTestParameters(_currentPoint));

如果您希望获得多个匹配的UserControl,可能是因为它们在您正在测试的点重叠,或者您正在使用命中测试几何进行测试,您可以通过返回HitTestFilterBehavior.ContinueSkipChildren来继续过滤。 / p>