在较高的DPI设置下,将screen . primarysscreen . workingarea转换为WPF尺寸

本文关键字:workingarea primarysscreen screen 转换 尺寸 WPF DPI 设置 | 更新日期: 2023-09-27 18:10:31

我在我的WPF应用程序中有以下函数,我用它来调整窗口的大小到主屏幕的工作区域(整个屏幕减去任务栏):

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    int theHeight = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;
    int theWidth = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
    this.MaxHeight = theHeight;
    this.MinHeight = theHeight;
    this.MaxWidth = theWidth;
    this.MinWidth = theWidth;
    this.Height = theHeight;
    this.Width = theWidth;
    this.Top = 0;
    this.Left = 0;
}

这工作得很好,只要机器的DPI设置为100%。然而,如果他们将DPI设置得更高,那么这就不起作用了,窗口就会从屏幕上溢出。我意识到这是因为WPF像素与"真正的"屏幕像素不一样,而且因为我使用WinForms属性来获取屏幕尺寸。

我不知道有什么WPF与screen . primarysscreen . workingarea等价。有没有什么东西可以让我在不考虑DPI设置的情况下工作?

如果没有,那么我想我需要某种缩放,但我不确定如何确定缩放多少。

如何修改我的函数以适应不同的DPI设置?

顺便说一下,如果你想知道为什么我需要使用这个函数而不仅仅是最大化窗口,这是因为它是一个无边界窗口(WindowStyle="None"),如果你最大化这种类型的窗口,它覆盖了任务栏

在较高的DPI设置下,将screen . primarysscreen . workingarea转换为WPF尺寸

您可以从SystemParameters.WorkArea属性中获得转换后的工作区大小:

Top = 0;
Left = 0;
Width = System.Windows.SystemParameters.WorkArea.Width;
Height = System.Windows.SystemParameters.WorkArea.Height;

在WPF中,您可以使用SystemParameters.PrimaryScreenWidthSystemParameters.PrimaryScreenHeight属性来查找主屏幕尺寸:

double width = SystemParameters.PrimaryScreenWidth;
double height = SystemParameters.PrimaryScreenHeight;

如果你想获得两个屏幕的尺寸,你只需使用:

var primaryScreen = 
   System.Windows.Forms
      .Screen
      .AllScreens
      .Where(s => s.Primary)
      .FirstOrDefault();
var secondaryScreen = 
   System.Windows.Forms
      .Screen
      .AllScreens
      .Where(s => !s.Primary)
      .FirstOrDefault();

之后,你可以使用

设置宽度,高度等
primaryScreen.Bounds.Width

So Long;)