在更高的DPI设置下将Screen.PrimaryScreen.WorkingArea转换为WPF尺寸

时间:2014-06-26 22:49:42

标签: c# .net wpf dpi

我的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.PrimaryScreen.WorkingArea。我可以使用哪些东西,无论DPI设置如何都可以使用?

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

如何修改我的功能以考虑不同的DPI设置?

顺便说一句,如果你想知道为什么我需要使用这个功能而不是仅仅最大化窗口,那是因为它是一个无边框窗口(WindowStyle =" None& #34;),如果你最大化这种类型的窗口,它将覆盖任务栏。

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

如果您想获得两个屏幕的尺寸,您可以使用:

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

太长了;)