0

我在尝试通过 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;
    }

谢谢!

4

1 回答 1

2

HitTestResultCallback只会为视觉树中实际具有渲染内容的视觉对象调用。例如,在 Label 控件中,回调将只返回构成 Label 的 Border 和 TextBlock,而不返回 Label 控件本身。您的 UserControl 也是如此。

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

或者,您还提供一个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.

于 2013-03-21T19:59:02.867 回答