.net - WPF:屏幕坐标和WPF坐标之间的转换

标签 .net wpf coordinates

据我了解,如果计算机未使用默认 DPI 设置,则 WPF 坐标与“真实”屏幕坐标(像素坐标)不同。在我的程序中,我想 (1) 找出 WPF 窗口位于哪个监视器上,以及 (2) 在同一监视器的左下角打开另一个窗口。我听说没有相当于Screen的东西对于 WPF,所以我使用 WinForms 版本,如下所示,在默认 96 DPI 下工作正常:

public void ChooseInitialPosition(Window w) // w is some other window
{
    var scr = System.Windows.Forms.Screen.FromRectangle(
          new System.Drawing.Rectangle((int)w.Left, (int)w.Top, (int)w.Width, (int)w.Height))
          .WorkingArea;

    this.Left = scr.Right - Width;
    this.Top = scr.Bottom - Height;
}

但在其他 DPI 下,这两个步骤都无法正常工作,并且可能会使窗口完全脱离屏幕。

到目前为止,看起来我可以使用 Visual.PointToScreen第一部分:

var p1 = w.PointToScreen(new Point(0,0));
var p2 = w.PointToScreen(new Point(w.Width,w.Height));
var scr = System.Windows.Forms.Screen.FromRectangle(
    new System.Drawing.Rectangle((int)p1.X, (int)p1.Y, (int)(p2.X - p1.X), (int)(p2.Y - p1.Y))).WorkingArea;

我不确定这是否完全正确,因为它可能无法正确解释边界。但第二部分更重要。如何将屏幕矩形“scr”转换为 WPF 空间,以便正确设置左侧和顶部?

最佳答案

  1. WPF 窗口位于哪个屏幕上:

    private static Screen GetScreen(Window window)
    {
       return Screen.FromHandle(new WindowInteropHelper(window).Handle);
    }
    
  2. 在同一屏幕的左下角打开另一个窗口:

    static Point RealPixelsToWpf(Window w, Point p)
    {
        var t = PresentationSource.FromVisual(w).CompositionTarget.TransformFromDevice;
        return t.Transform(p);
    }
    private static void SetPositionBottomLeftCorner(Window sourceWindow, Window targetWindow)
    {
        var workingArea = GetScreen(sourceWindow).WorkingArea;
        var corner = RealPixelsToWpf(sourceWindow, new Point(workingArea.Left, workingArea.Bottom));
        targetWindow.Left = corner.X;
        targetWindow.Top = corner.Y - targetWindow.ActualHeight;
    }
    

关于.net - WPF:屏幕坐标和WPF坐标之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6931333/

相关文章:

.net - 如何在 ASP.NET MVC 中创建 CheckBoxListFor 扩展方法?

c# - 设置 Webview2 header 或 cookie

Java LibGDX : How to get a map based coordinate system?

Python根据距离均匀分散固定中心周围的坐标

python-3.x - python中的随机函数在圆内生成随机对

.net - FileSystemWatcher 工作完成了吗?

c# - Visual Studio 中的构造函数依赖代码片段

c# - 如何在 C# 中单击时将鼠标指针更改为图像

.net - WPF - 在 SYSTEM 帐户下执行进程时性能低下

WPF - 使用变量/参数创建可重用样式