1

我们使用了 WPF 弹出控件。

我们需要知道如何计算 Popup 控件距离屏幕顶部的距离/高度或 Y 坐标。那么,如何计算呢?

请参阅附图以获取问题截图。

用于弹出问题的图像

我尝试了以下两种解决方案:

第一种解决方案------------------------------------------------ --------

Window w = Application.Current.Point 
relativePoint = popNonTopMostPopup.TransformToAncestor(w)
                             .Transform(new Point(0, 0));

问题:它总是返回与 relativePoint.X = 3.0 和 relativePoint.Y = 25.96 相同的坐标
我的弹出控件在地图图标的右侧打开,如图所示......所以当我点击不同的地图图标时,弹出位置相应地改变。所以它应该返回不同的地理坐标。

第二种解决方案------------------------------------------------ ----

Point position = popNonTopMostPopup.PointToScreen(new Point(0d, 0d)),
controlPosition = this.PointToScreen(new Point(0d, 0d));
position.X -= controlPosition.X;
position.Y -= controlPosition.Y;

问题:这个解决方案也有同样的问题..每次位置.X = 3.0 和位置.Y = 49.0 时它总是返回相同的地理坐标

4

2 回答 2

0

你可以使用这个:

TransformToAncestor如此处所示。

Point relativePointInWindow = yourPopup.TransformToAncestor(yourWindow)
                                       .Transform(new Point(0, 0));

即使在一个UserControl你可以访问父

popup.parent.parent    
popup => usercontrol => window

否则,您可以使用Application.Current.MainWindowMainWindow。

然后你去获取你的弹出窗口的位置,如上所示。

如果需要,您可以添加System.Windows.SystemParameters.CaptionHeight到结果中。

这可能看起来与此类似(未经测试):

public class MyMapArea : UserControl
{
    public MyMapArea()
    {

    }

    /// <summary>
    /// Returns the Y position relative to ScreenTop in Pixels
    /// </summary>
    private int GetYPositionOfPopup()
    {
        Popup popup = this.popup;

        Window window;

        FrameworkElement element;

        //Walk up the ui tree
        while(1 == 1)
        {
            //Remember to check for nulls, etc...
            element = this.parent;
            if(element.GetType() == typeof(Window))
            {
                //if you found the window set it to "window"
                window = (window)element;
                break;
            }
        }

        Point relativePointInWindow = popup.TransformToAncestor(window)
                                   .Transform(new Point(0, 0));

        return relativePointInWindow.Y // + System.Windows.SystemParameters.CaptionHeight;
    }
}
于 2017-06-23T10:46:14.873 回答
0

下面的逻辑可以计算一个控件在弹出窗口内的位置。它可以在弹出窗口显示后进行计算(否则源将为空)。

当您显示弹出窗口的内容时,您处于不同的可视化树中,因此没有必要对原始 Popup 对象进行任何计算。

var source = PresentationSource.FromVisual(controlInsidePopup);
if (source == null)
  return;

// Get absolute location on screen of upper left corner of the control
var locationFromScreen = controlInsidePopup.PointToScreen(new Point(0, 0));

var targetPoints = source.CompositionTarget.TransformFromDevice.Transform(locationFromScreen);

string positionInfo = $"Current Position X: {targetPoints.X}, Y: {targetPoints.Y}";

代码是从这里获取的稍微修改的逻辑:https ://social.msdn.microsoft.com/Forums/vstudio/en-US/281a8cdd-69a9-4a4a-9fc3-c039119af8ed/absolute-screen-coordinates-of-wpf -用户控制?论坛=wpf

于 2019-03-13T14:13:12.700 回答