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

 

 

個人小站歡迎來踩:駕校教練評價平台 | 為愛豆砌照片牆

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM