如何在 WPF 中的多显示器显示上定位窗口?

ymb*_*xSw 3 c# wpf windows-10

我正在尝试在辅助显示器的右上角放置一个窗口。在 Window_Loaded 事件处理程序中,我有以下代码:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    this.Left = Screen.AllScreens[1].WorkingArea.Left;
    this.Top = Screen.AllScreens[1].WorkingArea.Top;
}
Run Code Online (Sandbox Code Playgroud)

当我的两个显示器的比例因子均为 100% 时,这非常有效,但是一旦我更改主显示器的比例,窗口就会完全加载到屏幕外。

有谁知道在 WPF 中绝对定位窗口的方法?我找到的大多数答案都是 Win8.1 之前的,不必担心缩放。我似乎无法弄清楚TopLeft属性背后的模式。感谢您的帮助。

小智 6

我在 CodeProject 上找到了解决这个问题的方法

两个屏幕上的 WPF 窗口

解决方案是计算真实分辨率和 的分辨率之间的比率WorkingArea

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var scaleRatio = Math.Max(Screen.PrimaryScreen.WorkingArea.Width / SystemParameters.PrimaryScreenWidth,
                Screen.PrimaryScreen.WorkingArea.Height / SystemParameters.PrimaryScreenHeight);
    this.Left = Screen.AllScreens[1].WorkingArea.Left / scaleRatio ;
    this.Top = Screen.AllScreens[1].WorkingArea.Top / scaleRatio ;
}
Run Code Online (Sandbox Code Playgroud)

  • 当存在多个具有不同缩放比例的显示器时,这是少数能够真正正确处理问题的解决方案之一。 (2认同)

ymb*_*xSw 2

您可以执行以下操作

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var p = this.PointFromScreen(new Point(Screen.AllScreens[1].WorkingArea.X, Screen.AllScreens[1].WorkingArea.Y));
    this.Left += p.X;
    this.Top += p.Y;
}
Run Code Online (Sandbox Code Playgroud)

我发现 PointFromScreen 函数告诉您绝对坐标相对于窗口的偏移量。选择显示屏左上角的位置,您就知道需要移动多少 - 但重要的是它的单位与窗口的Top和相同Bottom。这是一个相当狭窄的案例,但可以推断出一般的定位。希望能帮助到你!