我想获得一个元素相对于window / root元素在双击时的绝对位置。元素在其父元素中的相对位置是我似乎可以到达的所有位置,而我试图到达的是相对于窗口的点。我已经看到了如何在屏幕上而不是在窗口中获得元素点的解决方案。
Answers:
我认为BrandonS想要的不是鼠标相对于根元素的位置,而是某些后代元素的位置。
为此,有TransformToAncestor方法:
Point relativePoint = myVisual.TransformToAncestor(rootVisual)
.Transform(new Point(0, 0));
myVisual
刚刚双击的元素在哪里,rootVisual
Application.Current.MainWindow或您想要相对的位置。
要获取窗口中UI元素的绝对位置,可以使用:
Point position = desiredElement.PointToScreen(new Point(0d, 0d));
如果您位于用户控件内,并且只希望UI元素在该控件内的相对位置,则只需使用:
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
元素在屏幕上或屏幕外滑动图像的动画一起使用,因此它需要知道元素在屏幕上的绝对位置。
嗯 您必须指定单击的窗口Mouse.GetPosition(IInputElement relativeTo)
以下代码对我来说效果很好
protected override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
Point p = e.GetPosition(this);
}
我怀疑您需要不是从它自己的类而是从应用程序的其他地方引用该窗口。在这种情况下Application.Current.MainWindow
会为您提供帮助。