wpf 自定义窗口,最大化时不覆盖任务栏

转载 2013年12月04日 16:41:54

相信很多人使用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

WPF最大化避免覆盖任务栏

WPF当窗体WindowStyle=”None”时,最大化会覆盖掉任务栏。如何解决这个问题呢?要用到Win32 API,通过让WPF窗体WM_GETMINMAXINFO消息挂接一个钩子来处理。 代码...
  • ryb666666
  • ryb666666
  • 2011年11月17日 16:25
  • 3436

窗口全屏,覆盖任务栏

给人做个东西,有这个要求 先放上一些玩意的隐藏 任务栏::ShowWindow(::FindWindow(_T("Shell_TrayWnd"), NULL), SW_HIDE); 开始菜单...
  • evi10r
  • evi10r
  • 2011年09月23日 23:29
  • 8399

C# WPF window窗体 覆盖任务栏

C# Window窗体最大化时默认显示不会覆盖任务栏   所以只有通过设置窗体的大小来模拟最大化效果 Rect WinBounds = new Rect();         public void...
  • u012790747
  • u012790747
  • 2015年01月08日 21:20
  • 630

[Delphi]窗口最大化时怎么才能不要把任务栏盖住

方法一:     设置要 全屏的窗体的ALign 属性为 alClient ,此法最快。     注意的是,窗体WindowStat要设置为wsNormal,如果设置为wsMax,会有部分被遮...
  • 36
  • 36
  • 2012年07月24日 14:10
  • 3572

WPF窗口最大化(不覆盖任务栏)

目的:让窗口初始化时 最大化,只有最小化和关闭按钮。(许多软件都是如此) 分析:网上好多实现都是一大堆代码··· 直接使用Win的API来获取各种参数··· 实现: //...
  • n0noper
  • n0noper
  • 2016年06月30日 17:34
  • 2547

QT 无边框窗体最大化 遮挡windows任务栏的问题

解决 QT 无边框窗体最大化 遮挡windows任务栏的问题
  • livemylife
  • livemylife
  • 2010年12月17日 14:35
  • 5690

对话框窗口最大化盖住任务栏问题!

在写程序时,如果包含了标题栏,但是没有包含最大化按钮或者最小话按钮,那么人工用ShowWindow(SW_MAXIMIZE),窗口会盖住任务栏,并且窗口最大化后还可以拖动!解决窗口最大化可以拖动的问题...
  • hrbeuwhw
  • hrbeuwhw
  • 2012年04月23日 11:03
  • 4200

WPF解决界面全屏化但不遮挡任务栏的问题

学习C#有一段时间了,现在跟着做项目,碰到有个客户端界面总是全屏,对于客户来说没有任务栏很不习惯,所以做了些略微的修改   这是xmal文件的部分源码: Window x:Class="WpfP...
  • Mrhan210
  • Mrhan210
  • 2016年11月04日 17:18
  • 3665

MFC学习笔记——如何使窗口最大化,但不遮盖任务栏

使用ShowWindow(SW_MAXIMIZE),使对话框最大化后,任务栏也被遮住了,如何去掉任务栏的遮盖?而且对话框窗口还处于激活状态。此时,应该没有设置WS_CAPTION属性,只能自己Move...
  • shanshangyouzhiyangM
  • shanshangyouzhiyangM
  • 2016年07月19日 11:43
  • 1718

WPF窗体最小化到任务栏介绍

设置窗体属性showinTaskbar=false     WindowState ws;         WindowState wsl;         No...
  • sunxiaotianmg
  • sunxiaotianmg
  • 2013年05月12日 12:29
  • 1512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wpf 自定义窗口,最大化时不覆盖任务栏
举报原因:
原因补充:

(最多只允许输入30个字)