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

Bra*_*onS 81 wpf wpf-positioning

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

Rob*_*nee 119

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

为此,有TransformToAncestor方法:

Point relativePoint = myVisual.TransformToAncestor(rootVisual)
                              .Transform(new Point(0, 0));
Run Code Online (Sandbox Code Playgroud)

myVisual双击的元素在哪里,rootVisual是Application.Current.MainWindow或者你想要的位置相对于什么.

  • 只有在传入包含Visual的Visual时,Visual.TransformToAncestor才有效.如果您想要两个元素的相对位置而另一个不包含另一个元素,则可以使用Visual.TransformToVisual. (8认同)
  • TransformToVisual仍然需要一个共同的祖先,如果控件在弹出窗口中,这可能会有问题 (5认同)
  • 嗨,我尝试了此操作,但收到以下异常:System.InvalidOperationException未处理Message =指定的Visual不是此Visual的祖先。Source = PresentationCore有什么想法吗? (2认同)
  • @cod3monk3y - 或者,如果微软开源 WPF,我会向他们发送拉取请求 :-) (2认同)

Fil*_*lip 37

要获得窗口中UI元素的绝对位置,您可以使用:

Point position = desiredElement.PointToScreen(new Point(0d, 0d));
Run Code Online (Sandbox Code Playgroud)

如果您在用户控件中,并且只想在该控件中使用UI元素的相对位置,只需使用:

Point position = desiredElement.PointToScreen(new Point(0d, 0d)),
controlPosition = this.PointToScreen(new Point(0d, 0d));

position.X -= controlPosition.X;
position.Y -= controlPosition.Y;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您的显示比例未设置为100%(即在高DPI屏幕上),这可能无法达到预期效果. (3认同)

And*_*eas 17

将此方法添加到静态类:

 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);
    }
Run Code Online (Sandbox Code Playgroud)

relativeToScreen参数设置true为从整个屏幕的左上角false放置或从应用程序窗口的左上角放置.


小智 7

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

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

在此处查看文档。