当元素被双击时,我希望能够获取与窗口/根元素相关的元素绝对位置。我只能够获得该元素相对于其父元素的位置,而我想要获得相对于窗口的位置。我已经看到了如何在屏幕上获取元素点的解决方案,但没有看到如何在窗口上获取。
当元素被双击时,我希望能够获取与窗口/根元素相关的元素绝对位置。我只能够获得该元素相对于其父元素的位置,而我想要获得相对于窗口的位置。我已经看到了如何在屏幕上获取元素点的解决方案,但没有看到如何在窗口上获取。
我认为BrandonS想要的不是鼠标相对于根元素的位置,而是某个后代元素的位置。
为此,有一个名为TransformToAncestor的方法:
Point relativePoint = myVisual.TransformToAncestor(rootVisual)
.Transform(new Point(0, 0));
当双击元素时,myVisual
代表该元素本身,而rootVisual
则代表与应用程序主窗口或其他你所需的元素的位置相关联。
要获取窗口内 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
来滑动图像进入或离开屏幕,因此它需要知道元素在屏幕上的绝对位置。 - cod3monk3y*yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*)
。childObj.MouseDown += (object sender, MouseButtonEventArgs e) =>
{
Vector parent = (Vector)e.GetPosition(parentObj);
Vector child = (Vector)e.GetPosition(childObj); // sender
Point childPosition = (Point)(parent - child);
};
嗯。
你必须指定你点击的窗口 Mouse.GetPosition(IInputElement relativeTo)
以下代码对我很有效
protected override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
Point p = e.GetPosition(this);
}
Application.Current.MainWindow
会帮助你。