FindElementsInHostCoordinates 相对于控制空间而不是整个页面

发布于 2024-08-20 15:01:34 字数 589 浏览 5 评论 0原文

我使用 VisualTreeHelper 方法 FindElementsInHostCooperatives 在给定的 X 和 Y 位置查找 ListBoxItem。但是,X 和 Y 值似乎与整个页面中的点相关,而不仅仅是我感兴趣的 ListBox(即使我将该元素传递到方法的子树参数中)。下面,这指的是从 ListBox 派生的自定义控件。

foreach (UIElement element in VisualTreeHelper.FindElementsInHostCoordinates(new Point(X, Y), this))
{
    if (element is ListBoxItem)
    {
        int index = this.ItemContainerGenerator.IndexFromContainer(element);
        break;
    }
}

因此,(0,0) 将相对于整个插件的左上角而不是列表框的左上角。我是否需要自己在这里做一些数学工作(在代码中)将页面坐标转换为 ListBox 坐标,或者是否有其他方法进行命中测试来判断给定的 X 和 Y 点是否位于 ListBoxItem 上?

谢谢。

I'm using the VisualTreeHelper method FindElementsInHostCoordinates to find a ListBoxItem at the given X and Y location. However, X and Y value appear to be related to points in the entire page not just the ListBox I'm interested in (even though I'm passing in that element into the subtree parameter of the method). Below, this refers to a custom control which derives from ListBox.

foreach (UIElement element in VisualTreeHelper.FindElementsInHostCoordinates(new Point(X, Y), this))
{
    if (element is ListBoxItem)
    {
        int index = this.ItemContainerGenerator.IndexFromContainer(element);
        break;
    }
}

So, (0,0) would be relative to the top left corner of the entire plug-in not the top left corner of the ListBox. Do I need to do some mathematical work here myself (in code) to transform the page coordinates to the ListBox coordinates or is there some other way to do a hit test to tell if a given X and Y point is over a ListBoxItem?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

尛丟丟 2024-08-27 15:01:34

我自己解决了这个问题(哇)。我确定了控件的顶部和左侧值,然后将 X 和 Y 值添加到控件内部:

GeneralTransform gt = this.TransformToVisual(Application.Current.RootVisual as UIElement);
Point offset = gt.Transform(new Point(0, 0));
double controlTop = offset.Y + Y;
double controlLeft = offset.X + X;

因此,我可以传入相对于控件的 X 和 Y 值,但此代码会将其转换为全局坐标。

对我有用,嘿!,这个问题没有风滚草徽章。 :)

I figured this out myself (wow). I determined the top and left values for my control and then added the X and Y values internal to my control:

GeneralTransform gt = this.TransformToVisual(Application.Current.RootVisual as UIElement);
Point offset = gt.Transform(new Point(0, 0));
double controlTop = offset.Y + Y;
double controlLeft = offset.X + X;

So, I can pass in X and Y values relative to my control, but this code will transform it to global coordinates.

Works for me and hey!, no tumbleweed badge on this question. :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文