Получить абсолютное положение элемента внутри окна в wpf

Я хотел бы получить абсолютную позицию элемента относительно элемента window/root при двойном щелчке. Элемент относительного положения внутри родительского элемента - это все, что я могу понять, и то, что я пытаюсь найти, - это точка относительно окна. Я видел решения о том, как получить точку элемента на экране, но не в окне.

Ответ 1

Я думаю, что BrandonS хочет, это не позиция мыши относительно корневого элемента, а позиция какого-то элемента-потомка.

Для этого существует метод TransformToAncestor:

Point relativePoint = myVisual.TransformToAncestor(rootVisual)
                              .Transform(new Point(0, 0));

Где myVisual - это элемент, который был просто дважды щелкнул, а rootVisual - Application.Current.MainWindow или что бы вы ни хотели относительно позиции.

Ответ 2

Чтобы получить абсолютное положение элемента интерфейса в окне, вы можете использовать:

Point position = desiredElement.PointToScreen(new Point(0d, 0d));

Если вы находитесь в пользовательском элементе управления и просто хотите относительное положение элемента интерфейса внутри этого элемента управления, просто используйте:

Point position = desiredElement.PointToScreen(new Point(0d, 0d)),
controlPosition = this.PointToScreen(new Point(0d, 0d));

position.X -= controlPosition.X;
position.Y -= controlPosition.Y;

Ответ 3

Добавьте этот метод к статическому классу:

 public static Rect GetAbsolutePlacement(this FrameworkElement element, bool relativeToScreen = false)
    {
        var absolutePos = element.PointToScreen(new System.Windows.Point(0, 0));
        if (relativeToScreen)
        {
            return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight);
        }
        var posMW = Application.Current.MainWindow.PointToScreen(new System.Windows.Point(0, 0));
        absolutePos = new System.Windows.Point(absolutePos.X - posMW.X, absolutePos.Y - posMW.Y);
        return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight);
    }

Установите relativeToScreen paramater на true для размещения в верхнем левом углу всего экрана или до false для размещения в верхнем левом углу окна приложения.

Ответ 4

Hm. Вы должны указать окно, которое вы нажали в Mouse.GetPosition(IInputElement relativeTo) Следующий код хорошо работает для меня

protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);
        Point p = e.GetPosition(this);
    }

Я подозреваю, что вам нужно обратиться к окну не из его собственного класса, а из другой точки приложения. В этом случае Application.Current.MainWindow поможет вам.