Получить абсолютную позицию элемента в окне в wpf - PullRequest
75 голосов
/ 22 декабря 2008

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

Ответы [ 5 ]

112 голосов
/ 23 декабря 2008

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

Для этого есть метод TransformToAncestor :

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

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

37 голосов
/ 21 марта 2013

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

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;
15 голосов
/ 28 января 2014

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

 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 значение true для размещения в верхнем левом углу экрана или на false для размещения в верхнем левом углу окна приложения.

3 голосов
/ 22 июля 2018

Я знаю, что этот вопрос старый, но, начиная с .NET 3.0, вы можете просто использовать *yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*).

Это даст вам 0, 0 вашей кнопки, но в направлении контейнера. (Вы также можете указать другое значение 0, 0)

Проверьте здесь на документ.

0 голосов
/ 22 декабря 2008

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

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

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

...