94

我想在双击时获取元素相对于窗口/根元素的绝对位置。元素在其父元素中的相对位置似乎是我所能达到的,而我试图达到的是相对于窗口的点。我已经看到了如何在屏幕上而不是在窗口中获取元素点的解决方案。

4

6 回答 6

138

我认为 BrandonS 想要的不是鼠标相对于根元素的位置,而是某个后代元素的位置。

为此,有TransformToAncestor方法:

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

myVisual刚刚双击的元素在哪里,rootVisual是 Application.Current.MainWindow 或您想要的相对位置。

于 2008-12-22T22:57:45.233 回答
50

要获取窗口内 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;
于 2013-03-21T00:31:33.373 回答
18

将此方法添加到静态类:

 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放置或从应用程序窗口的左上角放置。

于 2014-01-28T16:59:48.197 回答
8

从 .NET 3.0 开始,您可以简单地使用*yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*).

这将为您提供按钮的 0、0 点,但指向容器。(你也可以给另一个点 0, 0)

在这里查看文档。

于 2018-07-22T11:44:18.227 回答
0
childObj.MouseDown += (object sender, MouseButtonEventArgs e) =>
{
    Vector parent = (Vector)e.GetPosition(parentObj);
    Vector child = (Vector)e.GetPosition(childObj); // sender
    Point childPosition = (Point)(parent - child);
};
于 2021-09-16T20:05:59.133 回答
-1

嗯。您必须指定在Mouse.GetPosition(IInputElement relativeTo) 以下代码中单击的窗口对我来说效果很好

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

我怀疑您需要不是从它自己的类而是从应用程序的其他点引用窗口。在这种情况下Application.Current.MainWindow会帮助你。

于 2008-12-22T18:59:51.797 回答