遇到的问题信息

  • 问题:当WindowStyle=None时,窗口最大化,不显示任务栏 —— 即窗体是全屏效果。
  • 解决中遇到的问题列表【主要涉及到任务栏发生改变后的一些问题处理】:
    • 最大化时,任务栏被遮盖;
    • 最大化后,拖动任务栏,无法自适应窗体;
    • 最大化后,拖动任务栏,窗体还原,还原数据丢失,始终显示最大;
    • 最大化后,拖动任务栏,窗体还原,设置之前保存的窗体位置数据,再次设置,由于和之前一样,窗体位置信息不生效;

解决方案

  • 思路:窗体最大化时,将窗体透明化,设置内部元素Grid的Margin属性,从而显示出任务栏
  • 步骤:

1、 设置窗体相关属性:WindowStyle="None" AllowsTransparency="True" Background="Transparent" ResizeMode="CanMinimize"

窗体需要支持透明,并将窗体设置为透明;设置ResizeMode,否则最大化时,边框会有影响。

2、 添加窗体最大化/还原代码如下:

    double normaltop;
double normalleft;
double normalwidth;
double normalheight;
/// <summary>
/// 最大化/还原处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Btn_maximize_Click(object sender, RoutedEventArgs e)
{
//wpf最大化 全屏显示任务栏处理
if (this.WindowState == WindowState.Normal)
{
normaltop = this.Top;
normalleft = this.Left;
normalwidth = this.Width;
normalheight = this.Height; double top = SystemParameters.WorkArea.Top;
double left = SystemParameters.WorkArea.Left;
double right = SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Right;
double bottom = SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Bottom;
gd_main.Margin = new Thickness(left, top, right, bottom); this.WindowState = WindowState.Maximized;
}
else
{
this.WindowState = WindowState.Normal; //必须先设置为0,在重新设值,若前后值一样,会失效 --拖动任务栏后,还原-始终显示在屏幕最左上方
this.Top = 0;
this.Left = 0;
this.Width = 0;
this.Height = 0; this.Top = normaltop;
this.Left = normalleft;
this.Width = normalwidth;
this.Height = normalheight; gd_main.Margin = new Thickness(0);
}
}

3、添加任务栏变化处理

注意:此节实现仅适用于.Net Framework 4.5及以上。因为4.0及以前的版本中不包含StaticPropertyChanged事件。

不过可以通过WndProc来自己实现,其中会有一个问题:利用WndProc来监听,结果是比较实时的,而SystemParameters中的值,实时性可能会跟不上,从而获取到的值仍然是旧的。

对此有两种解决方案:

  • 1、添加一个Timer 或者 直接Sleep,等待一下在SystemParameters的值【此法相对简单,但无法完全保证有效,毕竟SystemParameters中值更新的时间,还是要看.Net Framework】;
  • 2、利用Windows API读取系统值,用方法SystemParametersInfo获取SPI_GETWORKAREA【微软官方其实就是用这个获取的,这样比我下面的运行效率还要高些】

另外:下面的方法可能会有系统兼容性问题,我在Windows 10上是通过的,但在Windows 8.1上,边界存在问题【不确定是不是Framework在系统上有bug】

注册事件:SystemParameters.StaticPropertyChanged += SystemParameters_StaticPropertyChanged;

添加如下代码:

    private void SystemParameters_StaticPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "WorkArea")
{
if (this.WindowState == WindowState.Maximized)
{
double top = SystemParameters.WorkArea.Top;
double left = SystemParameters.WorkArea.Left;
double right = SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Right;
double bottom = SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Bottom;
gd_main.Margin = new Thickness(left, top, right, bottom);
}
}
}

相关下载

点击查看完整源代码

解:奇葩史

最新文章

  1. u3d_Shader_effects笔记2 自定义surfaceDiffuseLight
  2. redis 配置文件 append only file(aof)部分---数据持久化
  3. pdf转能编辑的word的方法
  4. @Styles.Render
  5. 链接与ELF文件格式的复习
  6. mysql 查询
  7. 测试浏览器最多能包含Cookie的个数和Cookie中包含的最多内容
  8. 操作系统和Python的发展历程
  9. lua 函数回调技巧
  10. Unity3D脚本使用:游戏对象访问
  11. 2017西安网络赛 F
  12. destoon数据库表解释说明
  13. 命令行程序增加 GUI 外壳
  14. &#127827; vue循环渲染本地图片不显示? &#127827;
  15. 如何编辑PDF文件,怎么使用PDF裁剪页面工具
  16. Django2.1.3 smtp 邮件 553报警
  17. Flutter 相机定制
  18. HTML的前世今生
  19. 如何注销Sitecore CMS
  20. ts问题处理(2): &#39;Promise&#39; only refers to a type, but is being used as a value here.

热门文章

  1. spark能传递外部命名参数给main函数吗?
  2. java代码之美(8)---guava字符串工具
  3. Vue Route Building the UI back-end framework
  4. Android软键盘事件imeOptions响应
  5. 【斐波那契数列】java探究
  6. 版本管理工具Git(一)简要介绍
  7. centos7下vim8.1的编译安装教程
  8. 环境与工具2:建立高效的mac环境
  9. 【Node.js】通过mongoose得到模型,不能新添字段的问题
  10. QSS的使用(二)——实现ColorLabel