gpt4 book ai didi

wpf - WPF 中 VisualTreeHelper.HitTest 的问题

转载 作者:行者123 更新时间:2023-12-02 05:01:25 33 4
gpt4 key购买 nike

我正在尝试在 Canvas 上对一堆用户控件进行 HitTest 。我不希望 HitTest() 全程遍历可视化树,因此我使用 FilterCallback 来确保只对 UserControl 进行 HitTest 。

我的问题是 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.
}

最佳答案

我知道现在回答这个问题已经太晚了,但这里是:另一种方法是重写 UserControl 上的 HitTestCore 并为其提供预期的默认行为:

protected override System.Windows.Media.HitTestResult HitTestCore(System.Windows.Media.PointHitTestParameters hitTestParameters)
{
return new PointHitTestResult(this, hitTestParameters.HitPoint);
}

(当然,您可以使事情复杂化并对实际的子项或其边界框的组合进行 HitTest ,但对我来说,用户控件的边界框已经足够好了;另外,如果您想针对几何体进行 HitTest 您还需要覆盖第二个重载。)

这使其按预期工作,在过滤器中使用 HitTestFilterBehavior.ContinueSkipChildren 时过滤掉子项。

关于wpf - WPF 中 VisualTreeHelper.HitTest 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3411910/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com