Я хотел бы получить абсолютную позицию элемента относительно элемента window/root при двойном щелчке. Элемент относительного положения внутри родительского элемента - это все, что я могу понять, и то, что я пытаюсь найти, - это точка относительно окна. Я видел решения о том, как получить точку элемента на экране, но не в окне.
Получить абсолютное положение элемента внутри окна в wpf
Ответ 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
поможет вам.