Это немного не интуитивно понятно, но это можно сделать. Это двухступенчатый процесс. Во-первых, что вы хотите использовать функцию TransformToVisual
( из MSDN ):
Возвращает объект преобразования, который можно использовать для преобразования координат из UIElement в указанный объект.
TransformToVisual
даст GeneralTransform
, который будет выполнять преобразование из любого UIElement в любой другой UIElement (учитывая, что они оба существуют в одном и том же визуальном дереве). Похоже, что вы хотите, это преобразование из RootVisual
.
var transform = Application.RootVisual.TransformToVisual(myUiElement);
Объект transform
теперь является общим преобразованием, которое можно использовать для преобразования чего-либо так же, как преобразовано myUiElement
относительно RootVisual
.
Следующим шагом является преобразование точки с использованием этого преобразования.
var myUiElementPosition = transform.Transform(new Point(0,0));
myUiElementPosition
теперь является Point
, который был преобразован и должен быть позицией UIElement
, которую вы ищете. new Point(0,0)
используется, потому что я предполагаю, что вы хотите задать позицию относительно верхнего левого угла RootVisual
.