вы можете использовать GeneralTransform, чтобы определить позицию UIElement относительно контейнера. Вот фрагмент кода:
/// <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;
}
Ура, Алекс
[EDIT] На самом деле, проверка «контейнера» на null не нужна - TransformToVisual также примет null в качестве параметра.
Другая проблема: TransformToVisual создает исключение ArgumentException, например, когда «элемент» не виден, в данный момент отсутствует в визуальном дереве и т. д. и т. д.
К сожалению, я не смог найти способ определить, будет ли TransformToVisual генерировать это исключение до фактического вызова его для «элемента». Поэтому я просто обернул вызовы TransformToVisual в блок try-catch и проглотил исключение ArgumentException, потому что оно, в любом случае, совершенно бесполезно.