【问题标题】:Set the max height of wpf window based on available screen's size根据可用屏幕的大小设置 wpf 窗口的最大高度
【发布时间】:2019-08-13 11:15:00
【问题描述】:

我有一个 WPF 窗口,它在具有不同分辨率的多台显示器上运行。当我将窗口从高分辨率显示器移动到低分辨率显示器时,它会很好,但不需要足够聪明来改变最大高度,反之亦然。

目前的要求很简单,可以根据我当前显示器的高度设置模态窗口的最大高度。

我已经测试了一些东西,比如

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

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

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

【问题讨论】:

  • 在我们的应用程序中,我们通过 P/Invoke 使用来自 user32.dll 的以下函数 bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi); IntPtr MonitorFromWindow(IntPtr handle, int flags); 和 IntPtr MonitorFromPoint(POINT point, int flags); 来处理具有不同分辨率/dpi 的显示器上调整窗口大小的类似问题
  • @PavelAnikhouski 你能分享示例代码以及使用的参考吗,我很难找到 MONITORINFO 结构
  • @MegaMind:你看到this了吗?
  • 我创建了一个帮助类来获取屏幕参数,您可以使用它来调整窗口大小。在此处查看此 SO 答案:Screen Parameters

标签: wpf


【解决方案1】:

您可以使用 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 函数的 pinvoke。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      相关资源
      最近更新 更多