事情是这样的,笔者最近正在奋笔疾书的敲代码时突然客户方爆出了个bug,bug是什么呢?
客户使用的时笔记本电脑启动了软件,但是在连接外显示屏的时候,把软件拖到了扩展屏幕上进行显示,居然发现点击最大化图标的时候没法全屏显示,作者赶紧快马加鞭进行处理。
首先,我代码时直接使用了 window.WindowState = WindowState.Maximized;
这样的方法使窗口进行最大化,这个方法在正常情况下是常被使用的方法,因为快速简便,但是现WPF的程序的窗口基本都是自定义的样式,几乎没有人还在用窗口原生的WindowStyle。笔者也是在属性里设置了WindowStyle = None;
然后用了这样的最大化,这在笔记本原本屏幕和台式机上都是没问题的,但是当笔记本接上了外接屏幕之后,怎What fuck! 至此bug完美复现…
图片如下
当然了也不是说这种最大化方法有问题,在使用原生的最大最小化界面的时候,是没有任何问题的。可见只是我们没有设置好属性,因为用此方法的最大化本质上是给窗口赋值最大高度和宽度即MaxHeight和MaxWidth,所以肯定是要从这一关键点入手。
对于屏幕的属性,WPF提供了一个类方便获取,SystemParameters,但是经过尝试,用WorkArea,PrimaryScreen,FullScreen获取的高度宽度实际上与拓展屏幕的实际宽高不符合,所以根本不能用,实际上Maxsized方法默认的就是用这样的方法去获取的高度,结果跟之前是一样的
经过尝试下来,有一种方法可以,那就是利用winform里面的Screen的获取方法
//获取窗口句柄
var handle = new WindowInteropHelper(this).Handle;
//获取当前显示器屏幕
System.Windows.Forms.Screen screen = System.Windows.Forms.Screen.FromHandle(handle);
//调整窗口最大化,全屏的关键代码就是下面3句
this.MaxWidth = screen.Bounds.Width + 7;
this.MaxHeight = screen.Bounds.Height;
this.WindowState = WindowState.Maximized;
测试下来这个方法是没有问题的可以获取,当然了方法不只是这一种只不过,C#用这个方法最简便快捷,同时要使用Maxsized这种方式在拓展屏幕上没问题的思路就是要设置MaxHeight和Width的值,这个是非常关键的,有了这个关键点,我们才能更加得心应手的去解决问题,那解决方法自然就变得开放了起来,好了,这个问题就是记录一下发散下自己的思维,如果有用,别忘了给个赞