zoukankan      html  css  js  c++  java
  • wpf 自定义窗口,最大化时不覆盖任务栏

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

    在网上找答案,排名靠前的都是提供用hook钩子,篇幅很长,如:http://www.cnblogs.com/zhouyinhui/archive/2008/11/04/1326188.html

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

             Rect rcnormal;//定义一个全局rect记录还原状态下窗口的位置和大小。
            /// <summary>
            /// 最大化
            /// </summary>
            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;
            }
            /// <summary>
            /// 还原
            /// </summary>
            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);
                    }
                }
            }

    转载请写明出处:http://www.cnblogs.com/jying/p/3180194.html

    个人小站欢迎来踩:驾校教练评价平台 | 为爱豆砌照片墙

      

  • 相关阅读:
    STL标准函数库学习小总结
    3 种生成高强度密码的方法
    树莓派使用 OLED 屏显示图片及文字
    一个骚命令防止你的文件被误删除!
    B站,首战告捷!
    10 个提高效率的 Linux 命令别名
    Vim的三款实用插件
    如何高效回退到特定层级目录?
    如何将目录下的脚本一次性全部执行
    数据结构|数组为什么这么快?
  • 原文地址:https://www.cnblogs.com/jying/p/3180194.html
Copyright © 2011-2022 走看看