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了,所以在这几个界 ...
随机推荐
- Javascript reduce方法
reduce方法接收一个函数作为累加器,数组中的每个值(从左至右)开始缩减,最终计算为一个值 注意:reduce()对于空数组是不会执行回调函数 语法: array.reduce(function(t ...
- Zara带你快速入门WPF(4)---Command与功能区控件
前言:许多数据驱动的应用程序都包含菜单和工具栏或功能区控件,允许用户控制操作,在WPF中,也可以使用功能区控件,所以这里介绍菜单和功能区控件. 一.菜单控件 在WPF中,菜单很容易使用Menu和Men ...
- .NET Core中的数据保护组件
原文地址: PREVENTING INSECURE OBJECT REFERENCES IN ASP.NET CORE 2.0 作者: Tahir Naushad 背景介绍 在 OWASP(开放式 W ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- 想在Java中实现Excel和Csv的导出吗?看这就对了
前言 最近在项目中遇到一个需求,需要后端提供一个下载Csv和Excel表格的接口.这个接口接收前端的查询参数,针对这些参数对数据库做查询操作.将查询到的结果生成Excel和Csv文件,再以字节流的形式 ...
- 【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战
一.写在前面 相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这是非常火的一门技术. 如果只是用户量很少的传统IT系统,使用Spring Cloud可能还暴露不出 ...
- 【Java基础】【18Map集合&模拟斗D主X排和F排】
18.01_集合框架(Map集合概述和特点) A:Map接口概述 查看API可以知道: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接 ...
- leetcode — pascals-triangle
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...
- 【Axios】前端页面使用axios调用后台接口
项目基本情况 前端项目是用vue.js做的,前端起的服务URL:http://localhost:8080/ 后端项目是用Node.js做的,后端起的服务URL:http://localhost:30 ...
- [VsCode] 开发所使用的VsCode的插件
vscode 的插件 必须 Chinese (Simplified) Language Pack for Visual Studio Code Markdown Preview Enhanced De ...