【问题标题】:C# WPF Auto Resize Window When Taskbar Height ChangedC# WPF 在任务栏高度更改时自动调整窗口大小
【发布时间】:2019-06-29 03:19:28
【问题描述】:

我有一个具有以下属性的 WPF 窗口:

-ResizeMode=NoResize

-WindowStyle=None

我制作了普通窗口的所有功能,但我不知道如何在任务栏的高度发生变化时使窗口自动调整大小(最大化时)。 (如 Microsoft Visual Studio 2017 窗口)。

我可以手动最大化我的窗口,但如果我隐藏任务栏,我的窗口和屏幕底部之间会有一个空白区域。

工作区改变时是否触发了任何事件?

【问题讨论】:

    标签: wpf maximize-window


    【解决方案1】:

    为您的窗口处理 WM_GETMINMAXINFO 消息,并执行您需要做的任何调整大小

        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;
        }
    

    请注意,如果您是无边框、不可调整大小的窗口,您可能还需要获取监视器信息(通过 Win32 GetMonitorInfo)并将您的应用程序限制在其所在监视器的工作区。在我们的系统上,windows 不能正确调整 1900x1200 显示器的窗口大小(它太高了,所以我们必须根据 Monitor Info 设置 MaxHeight,并注意如果通过继续观看来调整任务栏的大小,它会发生变化WM_GETMINMAXINFO 消息)。

    如果您也遇到这些问题,此博客可能会有所帮助:

    https://blogs.msdn.microsoft.com/llobo/2006/08/01/maximizing-window-with-windowstylenone-considering-taskbar/

    【讨论】:

      【解决方案2】:

      对于您的问题,您可以使用SystemParameters.WorkArea。 初始设置 MainWindow 的 MaxHeight

      MaxHeight="{Binding Height, Source={x:Static SystemParameters.WorkArea}}"
      

      在 MainWindow 的代码隐藏中注册 SystemParameters.StaticPropertyChanged 以接收更改并更新您的窗口大小。

      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;
               });
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2013-09-11
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 2014-12-28
        • 2014-06-06
        相关资源
        最近更新 更多