【发布时间】:2011-03-08 01:24:10
【问题描述】:
我目前有一个用户控件,其中包含具有特定 X、Y 坐标的项目,并且这些点必须在什么范围内。在这种情况下,这些位置是 0 > X > 40 和 0 > Y > 80 (40x80)。我在其中托管这些项目的控件是动态的,但具有基于窗口大小的特定纵横比。我需要将这些 X 和 Y 坐标转换为用户控件内的相对位置。非常感谢任何帮助!提前致谢!如果它重要/有帮助,我正在使用 Silverlight。
【问题讨论】:
我目前有一个用户控件,其中包含具有特定 X、Y 坐标的项目,并且这些点必须在什么范围内。在这种情况下,这些位置是 0 > X > 40 和 0 > Y > 80 (40x80)。我在其中托管这些项目的控件是动态的,但具有基于窗口大小的特定纵横比。我需要将这些 X 和 Y 坐标转换为用户控件内的相对位置。非常感谢任何帮助!提前致谢!如果它重要/有帮助,我正在使用 Silverlight。
【问题讨论】:
您可以使用 GeneralTransform 来确定 UIElement 相对于容器的位置。这是一个sn-p:
/// <summary>
/// Gets the position of the specified element's top left corner, relative to the specified container.
/// </summary>
/// <param name="element"></param>
/// <param name="container"></param>
public static Point GetPosition(UIElement element, UIElement container)
{
if (element == null)
throw new ArgumentNullException("element");
if (container == null)
throw new ArgumentNullException("container");
var gt = element.TransformToVisual(container);
var position = gt.Transform(new Point(0, 0));
return position;
}
干杯,亚历克斯
[编辑] 事实上,检查“容器”是否为 null 是不必要的 - TransformToVisual 也将接受 null 作为参数。 另一个问题:TransformToVisual 将抛出 ArgumentException 例如当“元素”不可见时,当前不在可视树等中。 不幸的是,在“元素”上实际调用它之前,我找不到一种方法来确定 TransformToVisual 是否会抛出该异常。所以我只是简单地将 TransformToVisual 的调用封装在一个 try-catch 块中并吞下 ArgumentException,因为无论如何它都毫无用处,恕我直言。
【讨论】: