目录

介绍

背景

是Bug吗?

使用代码

解决方案

设置窗口的属性


介绍

假设您希望WPF应用程序没有标题栏,并且将最大化显示为“全屏”,那么您首先想到的是什么?这是最容易做到的。

  • WindowStyle设置为Maximized:这样,Window将不会显示任何标题栏。窗口样式将转换为带有边框的Box。
  • WindowState设置为None:这样,窗口将最大化到整个屏幕,并且仅显示该窗口,而没有其他显示。

就像我说的,它隐藏了整个屏幕,这意味着如果未将其设置为Always on Top属性,它甚至不会显示任务栏或应用于桌面的任何外部小工具。

是的,这是我最近遇到的问题,当时人们希望我显示TaskBar,即使应将应用程序最大化。

背景

是Bug吗?

如果我没看错,WPF会根据“屏幕分辨率”构建应用程序。它产生独立于DPI的像素。如果将其指定为全屏,则它将首先获取屏幕的分辨率,然后根据其自己的算法绘制像素。因此,当您将其指定为“最大化”时,它将占据整个屏幕,否则屏幕的某些部分将隐藏在边界范围之外。

还原WPF屏幕时,它还将根据分辨率边界之间的距离重新计算工作区域并相应地调整其大小。现在,您是否认为Microsoft真的应该有一个替代状态,可以像正常Windows一样显示任务栏?我想是的。

使用代码

解决方案

当我需要这样做时,我自己尝试了几种解决方法。

我必须使用以下代码:

private static System.IntPtr WindowProc(System.IntPtr hwnd,int msg,System.IntPtr wParam,System.IntPtr lParam,ref bool handled)
{switch (msg){case 0x0024:WmGetMinMaxInfo(hwnd, lParam);handled = true;break;}return (System.IntPtr)0;
}private static void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam)
{            MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));// Adjust the maximized size and position to fit the work area of the correct monitorint MONITOR_DEFAULTTONEAREST =0x00000002;System.IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);if (monitor != System.IntPtr.Zero){                MONITORINFO monitorInfo = new MONITORINFO();GetMonitorInfo(monitor, monitorInfo);RECT rcWorkArea = monitorInfo.rcWork;RECT rcMonitorArea = monitorInfo.rcMonitor;mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left);mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top);mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left);mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top);}Marshal.StructureToPtr(mmi, lParam, true);
}

调用API WmGetMinMaxInfo可获取当前桌面的“最大化”窗口的大小。

[DllImport("user32")]
internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO   lpmi);
[DllImport("User32")]
internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags);

调用GetMonitorInfo将获得一个MONITORINFO对象,如果您仔细查看代码,它实际上是以这样一种方式来定位窗口的:它完全根据矩形区域的高度和宽度调整自己的大小。

获取窗口句柄的更好方法是使用SourceInitialized事件。这也将避免每次动态更改窗口模板时调用ApplyTemplate。

public override void OnApplyTemplate(){System.IntPtr handle = (new WinInterop.WindowInteropHelper(this)).Handle;WinInterop.HwndSource.FromHwnd(handle).AddHook(new WinInterop.HwndSourceHook(WindowProc));}

要调用此方法,我可以使用SourceInitialized事件,它最终将在修改WindowState时调用。

win.SourceInitialized += new EventHandler(win_SourceInitialized);void win_SourceInitialized(object sender, EventArgs e)
{System.IntPtr handle = (new WinInterop.WindowInteropHelper(this)).Handle;WinInterop.HwndSource.FromHwnd(handle).AddHook(new WinInterop.HwndSourceHook(WindowProc));
}

设置窗口的属性

WindowStyle="None"
WindowState="Maximized"
ResizeMode="NoResize"

转到您的代码,然后根据PrimaryScreen width和height调整窗口大小。另外,还要确保你为窗口设置了Left和Top。

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

Normal 将确保该窗口的默认行为被覆盖,并使任务栏重新出现。

在WPF中最大化窗口并将WindowState设置为None的任务栏相关推荐

  1. WPF中通过控件Margin属性设置控件位置

    WPF中通过控件Margin属性设置控件位置 一.Margin属性简介 二.Margin在cs文件中定义 三.Margin设置控件位置 四.参考文档 一.Margin属性简介 在使用WPF进行页面设计 ...

  2. WPF 程序最大化,窗口,最小化

    public static void FullOrMin(this Window window)         {             //如果是全屏,则最小化             if ( ...

  3. 正确在WPF中对Windows窗体背景进行设置

    初次接触WPF,就被对窗体的背景图进行设置难住了.跟Winform区别很大, 如果没有正确设置的,会报错. 直接输入添加背景图片代码会弹出异常. <Window.Background> & ...

  4. WPF 中DataGrid控件显示和设置数据

    一.基础知识 1.DataGrid控件:用来显示数据的控件,从对象集合中获取信息并在具有行和单元格的网格中显示信息.每行和单独的对象相对应,并且每列和对象的某个属性相对应. 2.在DataGrid 中 ...

  5. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

    原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...

  6. [WPF疑难]避免窗口最大化时遮盖任务栏

    [WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后(比如很多情况下你会覆盖默认的窗体样式,即不采用W ...

  7. WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)

    原文:WPF中用于嵌入其他进程窗口的自定义控件(AppContainer) 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199 ...

  8. (转)WPF中让窗体不显示最大化,最小化,关闭按钮

      1.在WPF中如果不想让窗体显示最大化,最小化,以及关闭按钮的话,可以再窗体的属性面板设置 将ResizeMode=NoResize时,将不会显示最大化最小化,只有关闭按钮:如下图: 将Resiz ...

  9. WPF中,如何将Vista Aero效果扩展到整个窗口

    WPF中,如何将Vista Aero效果扩展到整个窗口 原文:WPF中,如何将Vista Aero效果扩展到整个窗口   WPF中,如何将Vista Aero效果扩展到整个窗口             ...

最新文章

  1. Spring Boot 解决跨域问题的 3 种方案!
  2. CentOS下yum源epel扩展源
  3. cout、cerr、clog
  4. elasticsearch mapping之index
  5. 枚举遍历法,你能循环遍历所有的枚举值吗?
  6. 百度php editor图片上传到其他盘,百度编辑器Editor图片独立上传
  7. MacFetionV0.8.0测试版
  8. 弹幕解析播放器json客户端解析后台管理源码
  9. MAVLink 协议解析之XML定义篇
  10. html让文本框左剧中对齐_HTML 样式 CSS
  11. hc06蓝牙模块介绍_微测评 | 小米智能插座蓝牙网关版
  12. Windows7 下载android源码
  13. windows 程序员计算器 详细解释
  14. 黑马python5_黑马Python5.0+人工智能课程升级5.0版本!【完整无秘】
  15. 关键路径过程详解、算法及其实现
  16. (XWZ)的Python学习笔记Ⅷ--------numpy
  17. 敏感词高效检测从浅到深
  18. Linux系统查看当前时间的命令
  19. gmail 设置 smtp_如何在Linux上使用Gmail或SMTP设置电子邮件警报
  20. Android 键值映射

热门文章

  1. python个人总结_python个人总结
  2. eclipse支持html,让eclipse完全支持HTML/JS/CSS智能提示
  3. 三维图形 纵坐标_《从柯氏四级培训效果评估到三维培训课程需求评估》
  4. Hpdl80服务器硬件驱动,hpe proliant dl80 gen9服务器用户指南.pdf
  5. ul c语言,IMX6UL裸机实现C语言蜂鸣器实验
  6. UI实用素材|APP动效设计
  7. Python if语句Demo
  8. 导入要素到要素类(C++)ArcEngine开发
  9. 一周文章导读:架构图;服务器;CPU
  10. MySQL连不上:ERROR 1698 (28000): Access denied for user 'root'@'localhost'