Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: BrandonSОтветов: 5

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

wpfwpf-positioning

Ответы

Ответ 1 · рейтинг 133 · Robert Macnee

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

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

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

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

Ответ 2 · рейтинг 49 · Filip

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

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 · рейтинг 18 · Andreas

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

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

Ответ 4 · рейтинг 6 · Guibi

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

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

Здесь можно найти документ.

Ответ 5 · рейтинг -1 · Oleg

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы