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记录还原状态下窗口的位置和大小。 ////// 最大化 /// 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); } } }
转载请写明出处:http://www.cnblogs.com/jying/p/3180194.html
个人小站欢迎来踩:驾校教练评价平台 | 为爱豆砌照片墙