博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wpf 自定义窗口,最大化时覆盖任务栏解决方案
阅读量:5786 次
发布时间:2019-06-18

本文共 4199 字,大约阅读时间需要 13 分钟。

原文:

相信很多人使用wpf时会选择自定义美观的窗口,因此会设置WindowStyle="None" 取消自带的标题栏。但这样使用 WindowState="Maximized" 或者后台 this.WindowState = System.Windows.WindowState.Maximized; 最大化窗口会覆盖掉系统任务栏,即全屏了。这其实并不是个很好的体验。

在网上找答案,排名靠前的都是提供用hook钩子,篇幅很长,如:

个人感觉这么一个小功能添加那么多的代码是不人性的,于是继续寻找,终于看到黎明的曙光:

Rect rcnormal;//定义一个全局rect记录还原状态下窗口的位置和大小。        ///         /// 最大化        ///         private void btnMaximize_Click(object sender, RoutedEventArgs e)        {            this.btnMaximize.Visibility = Visibility.Collapsed;            this.btnNormal.Visibility = Visibility.Visible;            rcnormal = new Rect(this.Left, this.Top, this.Width, this.Height);//保存下当前位置与大小            this.Left = 0;//设置位置            this.Top = 0;                        Rect rc = SystemParameters.WorkArea;//获取工作区大小            this.Width = rc.Width;            this.Height = rc.Height;        }        ///         /// 还原        ///         private void btnNormal_Click(object sender, RoutedEventArgs e)        {            this.Left = rcnormal.Left;            this.Top = rcnormal.Top;            this.Width = rcnormal.Width;            this.Height = rcnormal.Height;            this.btnMaximize.Visibility = Visibility.Visible;            this.btnNormal.Visibility = Visibility.Collapsed;        }

好了,最大化和最小化事件自定义好了。那如果窗口拖动到顶端鼠标出界的话窗口将会最大化是不是?在wpf中 WindowStyle="None" 下也还是全屏效果,而且会覆盖掉我们自定义的效果,这个时候你的this.width和this.height都无用了。那该怎么办呢?看下边:

在前台添加:

SizeChanged="Window_SizeChanged"

后台:

private void Window_SizeChanged(object sender, SizeChangedEventArgs e)        {            if (this.ActualHeight > SystemParameters.WorkArea.Height || this.ActualWidth > SystemParameters.WorkArea.Width)            {                this.WindowState = System.Windows.WindowState.Normal;                btnMaximize_Click(null, null);            }        }

或者在最大化后禁用拖动功能,待恢复原始窗口后在恢复拖动功能也可以。

ok,搞定! 这么简单的代码,相信大家看的懂吧~~

另附双击标题栏事件:

private void Grid_MouseDown(object sender, MouseButtonEventArgs e)        {            if (e.ClickCount == 2)            {                if (this.ActualWidth == SystemParameters.WorkArea.Width)                {                    btnNormal_Click(null, null);                }                else                {                    btnMaximize_Click(null, null);                }            }        }

最后总结代码:

Rect rcnormal;        protected virtual void InitializeEvent()        {            ControlTemplate baseWindowTemplate = (ControlTemplate)Application.Current.Resources["BaseWindowControlTemplate"];            TextBlock title = (TextBlock)baseWindowTemplate.FindName("lab_title", this);            title.Text = window_title;            title.Margin = mrg;            Button maxBtn = (Button)baseWindowTemplate.FindName("btnMax", this);            maxBtn.Visibility = btn_max;            bool tag = true;            maxBtn.Click += delegate            {                if (tag)                {                    tag = false;                    rcnormal = new Rect(this.Left, this.Top, this.Width, this.Height);                    this.Left = 0;                    this.Top = 0;                    Rect rc = SystemParameters.WorkArea;                    this.Width = rc.Width;                    this.Height = rc.Height;                    maxBtn.Style = (Style)Application.Current.Resources["btn_max2"];                }                else                {                    tag = true;                    this.Left = rcnormal.Left;                    this.Top = rcnormal.Top;                    this.Width = rcnormal.Width;                    this.Height = rcnormal.Height;                    maxBtn.Style = (Style)Application.Current.Resources["btn_max"];                }            };            Button closeBtn = (Button)baseWindowTemplate.FindName("btnClose", this);            closeBtn.Click += delegate            {                this.Close();            };            //拖动            Border borderTitle = (Border)baseWindowTemplate.FindName("borderTitle", this);            borderTitle.MouseMove += delegate(object sender, MouseEventArgs e)            {
//tag==true 只有窗口恢复到原始窗口后才可拖动           if (e.LeftButton == MouseButtonState.Pressed && tag==true) {             this.DragMove();           }        };

 

转载地址:http://pnmyx.baihongyu.com/

你可能感兴趣的文章
dubbo源码分析-架构
查看>>
新 Terraform 提供商: Oracle OCI, Brightbox, RightScale
查看>>
6套毕业设计PPT模板拯救你的毕业答辩
查看>>
IT兄弟连 JavaWeb教程 JSP与Servlet的联系
查看>>
Windows phone 8 学习笔记
查看>>
linux并发连接数:Linux下高并发socket最大连接数所受的各种限制
查看>>
详解区块链中EOS的作用。
查看>>
我的友情链接
查看>>
mysql-error 1236
查看>>
sshd_config设置参数笔记
查看>>
循序渐进Docker(一)docker简介、安装及docker image管理
查看>>
jsp页面修改后浏览器中不生效
查看>>
大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(四)高效的后台权限判断处理...
查看>>
信号量实现进程同步
查看>>
Spring4-自动装配Beans-通过构造函数参数的数据类型按属性自动装配Bean
查看>>
win10.64位wnmp-nginx1.14.0 + PHP 5. 6.36 + MySQL 5.5.59 环境配置搭建 结合Thinkphp3.2.3
查看>>
如何查看python selenium的api
查看>>
Python_Mix*random模块,time模块,sys模块,os模块
查看>>
iframe刷新问题
查看>>
数据解码互联网行业职位
查看>>