当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《在wpf中获取窗口中元素的绝对位置》经验,为你挑选了3个好方法。

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



1> Robert Macne..:

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

为此,有TransformToAncestor方法:

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

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


只有在传入包含Visual的Visual时,Visual.TransformToAncestor才有效.如果您想要两个元素的相对位置而另一个不包含另一个元素,则可以使用Visual.TransformToVisual.
TransformToVisual仍然需要一个共同的祖先,如果控件在弹出窗口中,这可能会有问题
嗨,我尝试了此操作,但收到以下异常:System.InvalidOperationException未处理Message =指定的Visual不是此Visual的祖先。Source = PresentationCore有什么想法吗?

2> 小智..:

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


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

3> Andreas..:

将此方法添加到静态类:

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

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有