5

我正在使用 VisualTreeHelper 方法 FindElementsInHostCoordinates 在给定的 X 和 Y 位置查找 ListBoxItem。但是,X 和 Y 值似乎与整个页面中的点有关,而不仅仅是我感兴趣的 ListBox(即使我将该元素传递到该方法的子树参数中)。下面,this 指的是从 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 的左上角。我是否需要自己在这里做一些数学工作(在代码中)将页面坐标转换为 ListBox 坐标,或者是否有其他方法可以进行命中测试以判断给定的 X 和 Y 点是否在 ListBoxItem 上方?

谢谢。

4

1 回答 1

9

我自己想通了(哇)。我确定了控件的顶部和左侧值,然后将 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 值,但是这段代码会将其转换为全局坐标。

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

于 2010-02-04T16:27:37.700 回答