根据可用屏幕的大小设置wpf窗口的最大高度

时间:2019-08-13 11:15:00

标签: wpf

我有一个WPF窗口,该窗口可在具有不同分辨率的多个监视器上运行。当我将窗口从高分辨率监视器移动到低分辨率监视器时,反而会变好,但是不必足够聪明地更改最大高度。

当前要求非常简单,可以根据当前监视器的高度设置模态窗口的最大高度。

我已经测试了

Screen.PrimaryScreen.WorkingArea.Height
Screen.PrimaryScreen.WorkingArea.Width

但是它只给出了我需要窗口当前所在屏幕高度的系统主屏幕的高度。

在多台监视器中,另一个主要问题是windows的顶级属性,在高分辨率监视器中,它很好,但在低分辨率或辅助监视器中,它从不同的数字开始,例如160。

2 个答案:

答案 0 :(得分:0)

您可以使用Win32 API MonitorFromWindow或Forms API Screen.FromHandle来确定窗口当前所在的监视器区域。

在下面的两个示例中,我将最大高度设置为窗口当前所在的监视器/屏幕的工作区域高度的50%。以下两个示例位于System.Windows.Window子类的方法中(因此 this 引用了Window)。

full example source code is here

Win32

var window = new System.Windows.Interop.WindowInteropHelper(this);
IntPtr hWnd = window.Handle;
var screen = System.Windows.Forms.Screen.FromHandle(hWnd);
MaxHeight = 0.5 * screen.WorkingArea.Height;

表格

var window = new System.Windows.Interop.WindowInteropHelper(this);
IntPtr hWnd = window.Handle;
IntPtr hMonitor = Win32.MonitorFromWindow(hWnd, Win32.MONITOR_DEFAULTTONEAREST);

var monitorInfo = new Win32.MONITORINFOEX();
monitorInfo.cbSize = (int)Marshal.SizeOf(monitorInfo);
if (Win32.GetMonitorInfo(hMonitor, ref monitorInfo))
{
    MaxHeight = (monitorInfo.rcWork.Bottom - monitorInfo.rcWork.Top) * 0.5;
}

请注意,Win32.MonitorFromWindow是Win32的MonitorFromWindow函数的重要组成部分。

答案 1 :(得分:0)

我认为测试程序中的帮助程序类将为DPI感知程序和非DPI感知程序提供您所需的值:Screen Parameters

这使用几个Win32 API调用来获取各种屏幕参数。它还提供了屏幕比例因子,可让您根据当前放置窗口的屏幕来调整窗口大小。