1. 程式人生 > >wpf 自定義視窗,最大化時不覆蓋工作列

wpf 自定義視窗,最大化時不覆蓋工作列

轉自:http://www.cnblogs.com/jying/archive/2013/07/09/3180194.html

相信很多人使用wpf時會選擇自定義美觀的視窗,因此會設定WindowStyle="None" 取消自帶的標題欄。但這樣使用 WindowState="Maximized" 或者後臺 this.WindowState = System.Windows.WindowState.Maximized; 最大化視窗會覆蓋掉系統工作列,即全屏了。這其實並不是個很好的體驗。

個人感覺這麼一個小功能新增那麼多的程式碼是不人性的,於是繼續尋找,終於看到黎明的曙光:

複製程式碼
         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);
                }
            }
        }
複製程式碼