Я хотел бы получить абсолютную позицию элемента по отношению к оконному / корневому элементу при двойном щелчке. Относительное положение элемента в его родительском элементе - это все, что мне кажется, и я пытаюсь добраться до точки относительно окна. Я видел решения, как получить точку элемента на экране, но не в окне.
Получить абсолютную позицию элемента в окне в wpf
Ответы (5)
Я думаю, что BrandonS хочет не положение мыши относительно корневого элемента, а скорее положение некоторого дочернего элемента.
Для этого есть TransformToAncestor метод:
Point relativePoint = myVisual.TransformToAncestor(rootVisual)
.Transform(new Point(0, 0));
Где myVisual
- это элемент, по которому только что дважды щелкнули, а rootVisual
- это Application.Current.MainWindow или любое другое положение, относительно которого вы хотите.
Чтобы получить абсолютное положение элемента пользовательского интерфейса в окне, вы можете использовать:
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;
Добавьте этот метод в статический класс:
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
для размещения из верхнего левого угла окна приложения.
RenderTransform
элемента, и поэтому ему необходимо знать абсолютное положение элемента на экране.
- person cod3monk3y; 05.02.2015
Начиная с .NET 3.0, вы можете просто использовать *yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*)
.
Это даст вам точку 0, 0 вашей кнопки, но в сторону контейнера. (Вы также можете указать другой балл, что 0, 0)
Хм. Вы должны указать окно, в котором вы щелкнули Mouse.GetPosition(IInputElement relativeTo)
Следующий код мне подходит
protected override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
Point p = e.GetPosition(this);
}
Я подозреваю, что вам нужно обращаться к окну не из его собственного класса, а из другой точки приложения. В этом случае вам поможет Application.Current.MainWindow
.