WPF中窗体最大化问题处理
遇到的问题信息
- 问题:当
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);
}
}
}
相关下载
解:奇葩史
WPF中窗体最大化问题处理的更多相关文章
- WPF中窗体在同一个位置实现不同页面切换
要想在WPF窗体中实现不同页面切换,我们就需要用到ContentControl这个控件,这个控件的位置和大小就是你要显示页面的位置和大小. 下面举例说明: Xaml: <Grid> < ...
- WPF中窗体调用窗体
在WPF中有时候我们需要在一个窗体中去调用另外的一个窗体,下面给出调用方法. 下面实现在MainWindow中通过点击一个按钮调用另外的一个窗口. 首先创建你要调用的另外一个窗口:点击最上面的项目 ...
- WPF编程,窗体最大化、最小化、关闭按钮功能的禁用
原文:WPF编程,窗体最大化.最小化.关闭按钮功能的禁用 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/detail ...
- WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如 WPF中不规则窗体与WebBrowser控件的兼 ...
- 01.WPF中制作无边框窗体
[引用:]http://blog.csdn.net/johnsuna/article/details/1893319 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormB ...
- WPF中不规则窗体与WebBrowser控件的兼容问题解决办法
原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法 引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序. ...
- WPF实现窗体中的悬浮按钮
WPF实现窗体中的悬浮按钮,按钮可拖动,吸附停靠在窗体边缘. 控件XAML代码: <Button x:Class="SunCreate.Common.Controls.FloatBut ...
- 通过WPF中UserControl内的按钮点击关闭父窗体
原文:通过WPF中UserControl内的按钮点击关闭父窗体 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article ...
- C#或者WPF中让某个窗体置顶
原文:C#或者WPF中让某个窗体置顶 前记:在工作中有个需求,要求不管到那个界面,我必须让一个浮动条(其实是个窗体)置顶. 我用wpf,因为有之前有好几个界面已经设置成topmost了,所以在这几个界 ...
随机推荐
- Python操作Redis及连接方式
前沿:随着互联网的高速发展,数据变得越来越重要,Python成为了人工智能的热门语言,而Nosql数据库已成为日常开发用品. 今天要写的是Python操作Redis Redis的安装我就不介绍了,你可 ...
- ASP.NET Core Mvc中空返回值的处理方式
原文地址:https://www.strathweb.com/2018/10/convert-null-valued-results-to-404-in-asp-net-core-mvc/ 作者: F ...
- Intent简介-Android开发
一.Intent介绍: Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述 ...
- jxa快速入门,Javascript已加入AppleScript全家桶
因为工作环境基本是以跨平台为主,所以纯mac本地化的AppleScript一直关注是不够的,前几天找资料发现AppleScript也在迅速的进步着,目前已经对Javascript做了比较好的支持--- ...
- AngularJS2+调用原有的js脚本(AngularJS脚本跟本地原有脚本之间的关系)
昨天一个话题说关于AngularJS2以后版本的两个小技巧,不料引出了另外一个话题,话题起始很简单: "很多的前端框架并不复杂,比如JQuery,引入即用,实时看到效果,多好.到了Angul ...
- peewee insert 数据时报错:'buffer' object has no attribute 'translate'
错误信息: "'buffer' object has no attribute 'translate'" 场景:使用peewee insert 数据时,BlobField 字段存储 ...
- 你真的会PHP吗?
Note: 1) PHP中的数据类型 PHP一共支持八种数据类型, 4种标量类型,boolean(布尔型),integer(整形),float/double(浮点型)和string(字符串类型), 2 ...
- Eclipse工具常用快捷键
Eclipse工具常用快捷键 一丶文件菜单常用快捷键 新建 Alt + shift + N 关闭当前编辑器 Ctrl +W 全部关闭 Ctrl + shift + w 保存 Ctrl + s 刷新 ...
- shell编程练习(二): 笔试11-20
笔试练习(二): 11.写一个shell脚本来得到当前的日期,时间,用户名和当前工作目录. [root@VM_0_5_centos test]# vi 11.sh [root@VM_0_5_cento ...
- EF操作数据库的步骤和一些简单操作语句
这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面 ...