C# WPF 自动调整大小 Window 当任务栏高度改变时
C# WPF Auto Resize Window When Taskbar Height Changed
我有一个 WPF window,它具有以下属性:
-ResizeMode=NoResize
-Window风格=None
我实现了普通 window 的所有功能,但我不知道如何让 window 在任务栏的高度发生变化时自动调整自身大小(当它最大化时)。 (如微软 Visual Studio 2017 Window)。
我可以手动最大化我的 window,但是如果我隐藏任务栏,我的 window 和屏幕底部之间会有一个空白 space。
工作区域改变时是否触发任何事件?
为您的 window 处理 WM_GETMINMAXINFO 消息,并做您需要做的任何事情 re-sizing
public MainWindow()
{
InitializeComponent();
SourceInitialized += new EventHandler(win_SourceInitialized);
}
private void win_SourceInitialized(object sender, EventArgs e)
{
System.IntPtr handle = (new WinInterop.WindowInteropHelper(this)).Handle;
WinInterop.HwndSource.FromHwnd(handle).AddHook(new WinInterop.HwndSourceHook(WindowProc));
}
private const int WM_GETMINMAXINFO = 0x0024;
private static System.IntPtr WindowProc(
System.IntPtr hwnd,
int msg,
System.IntPtr wParam,
System.IntPtr lParam,
ref bool handled)
{
switch (msg)
{
case WM_GETMINMAXINFO: //https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getminmaxinfo
WmGetMinMaxInfo(hwnd, lParam); // <------ Do what you need to here ---------->
handled = true;
break;
}
return (System.IntPtr)0;
}
请注意,如果您是无边框的,not-resizable window,您可能还需要获取监视器信息(通过 Win32 GetMonitorInfo)并将您的应用程序限制在监视器的工作区域它开着。在我们的系统上,windows 无法正确调整 1900x1200 显示器的 window 大小(它太高了,所以我们必须根据显示器信息设置 MaxHeight,并注意如果通过继续观看 WM_GETMINMAXINFO 消息来调整任务栏的大小。
如果您也有这些问题,此博客可能会有所帮助:
对于您的问题,您可以使用 SystemParameters.WorkArea
。
最初设置 MainWindow 的 MaxHeight
。
MaxHeight="{Binding Height, Source={x:Static SystemParameters.WorkArea}}"
在 MainWindow 的代码隐藏中注册 SystemParameters.StaticPropertyChanged
以接收更改并更新您的 window 大小。
SystemParameters.StaticPropertyChanged += (sender, args) =>
{
if (args.PropertyName == nameof(SystemParameters.WorkArea))
{
this.Dispatcher.Invoke(() =>
{
MaxHeight = SystemParameters.WorkArea.Height;
Height = SystemParameters.WorkArea.Height;
WindowState = WindowState.Normal; // Updates the windows new sizes
WindowState = WindowState.Maximized;
});
}
};
我有一个 WPF window,它具有以下属性:
-ResizeMode=NoResize
-Window风格=None
我实现了普通 window 的所有功能,但我不知道如何让 window 在任务栏的高度发生变化时自动调整自身大小(当它最大化时)。 (如微软 Visual Studio 2017 Window)。
我可以手动最大化我的 window,但是如果我隐藏任务栏,我的 window 和屏幕底部之间会有一个空白 space。
工作区域改变时是否触发任何事件?
为您的 window 处理 WM_GETMINMAXINFO 消息,并做您需要做的任何事情 re-sizing
public MainWindow()
{
InitializeComponent();
SourceInitialized += new EventHandler(win_SourceInitialized);
}
private void win_SourceInitialized(object sender, EventArgs e)
{
System.IntPtr handle = (new WinInterop.WindowInteropHelper(this)).Handle;
WinInterop.HwndSource.FromHwnd(handle).AddHook(new WinInterop.HwndSourceHook(WindowProc));
}
private const int WM_GETMINMAXINFO = 0x0024;
private static System.IntPtr WindowProc(
System.IntPtr hwnd,
int msg,
System.IntPtr wParam,
System.IntPtr lParam,
ref bool handled)
{
switch (msg)
{
case WM_GETMINMAXINFO: //https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getminmaxinfo
WmGetMinMaxInfo(hwnd, lParam); // <------ Do what you need to here ---------->
handled = true;
break;
}
return (System.IntPtr)0;
}
请注意,如果您是无边框的,not-resizable window,您可能还需要获取监视器信息(通过 Win32 GetMonitorInfo)并将您的应用程序限制在监视器的工作区域它开着。在我们的系统上,windows 无法正确调整 1900x1200 显示器的 window 大小(它太高了,所以我们必须根据显示器信息设置 MaxHeight,并注意如果通过继续观看 WM_GETMINMAXINFO 消息来调整任务栏的大小。
如果您也有这些问题,此博客可能会有所帮助:
对于您的问题,您可以使用 SystemParameters.WorkArea
。
最初设置 MainWindow 的 MaxHeight
。
MaxHeight="{Binding Height, Source={x:Static SystemParameters.WorkArea}}"
在 MainWindow 的代码隐藏中注册 SystemParameters.StaticPropertyChanged
以接收更改并更新您的 window 大小。
SystemParameters.StaticPropertyChanged += (sender, args) =>
{
if (args.PropertyName == nameof(SystemParameters.WorkArea))
{
this.Dispatcher.Invoke(() =>
{
MaxHeight = SystemParameters.WorkArea.Height;
Height = SystemParameters.WorkArea.Height;
WindowState = WindowState.Normal; // Updates the windows new sizes
WindowState = WindowState.Maximized;
});
}
};