在wpf中获取窗口中元素的绝对位置

时间:2008-12-22 16:57:11

标签: wpf wpf-positioning

我希望在双击时获得与窗口/根元素相关的元素的绝对位置。元素在它的父元素中的相对位置是我可以看到的,而我想要达到的是相对于窗口的点。我已经看到了如何在屏幕上获取元素点的解决方案,但不是在窗口中。

5 个答案:

答案 0 :(得分:112)

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

为此,有TransformToAncestor方法:

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

其中myVisual是刚刚双击的元素,而rootVisual是Application.Current.MainWindow或者你想要的位置相对于什么。

答案 1 :(得分:37)

要获得窗口中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;

答案 2 :(得分:15)

将此方法添加到静态类:

 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,以便从应用程序窗口的左上角放置。{/ p>

答案 3 :(得分:3)

我知道这个问题很旧,但是,从.NET 3.0开始,您可以简单地使用*yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*)

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

Check here for the doc.

答案 4 :(得分:-2)

嗯。 您必须指定在Mouse.GetPosition(IInputElement relativeTo)中单击的窗口 以下代码适合我

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

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