工作忙,博客都忘了写。很多零散的知识点,虽然比较陈旧,发现还是很多人没有遇到过。今天就分享一下,WPF的窗体全屏过程中出现的像素偏差问题的解决方法。
什么是WPF窗体全屏像素偏差?
WPF窗体全屏像素偏差指的是我们的窗体全屏后,左上角的坐标(0,0)并不能在显示区域中显示出来。
怎么出现?
我们新建一个WPF项目,添加一个新的窗体(如:MainWindows.xaml),设置窗体属性WindowState="Maximized"
,AllowsTransparency="True"
,WindowStyle="None"
。
这几项属性的设置,表示自定义的全屏窗体(这里要注意,一定要设置允许背景透明选项,设置此属性才会引发像素偏差问题)。
这个时候,我们在窗体中定义一个Border
,并设置边框粗细和颜色。
<Border BorderBrush="Red" BorderThickness="1"/>
运行查看显示效果:
我们会发现,窗体看不到红色的边框(比较简单,这儿就不贴图了)。
通过snoop
工具我们可以发现,窗口的大小并不是全屏大小,实际上会大于我们的分辨率大小。
以本机1920*1080
分辨率 125%DPI
为例。
窗口期望大小为:(1536 * 864)
窗体实际大小为:(1548.800… * 876.800…)
窗口的实际大小是大于期望大小的,我们的红框就自然而然看不到了!
为什么会这样?
因为窗体默认的ResizeMode
是CanResize
,系统会自动调整窗体大小。
默认窗体都是带有标题栏,系统会根据标题栏去计算客户区的大小,而CanResize
的设置主要是用于带有标题栏的场景。
所以在这种情况下,系统渲染的窗体大小,实际上会大于我们期望的窗体大小。
系统的计算逻辑,如果有兴趣,大家可深入研究!
如何解决?
解决方法其实很简单,我们只需要将ResizeMode
修改为NoResize
即可解决此问题。
显示效果:
本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/WPF-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E7%AA%97%E5%8F%A3%E5%85%A8%E5%B1%8F%E5%AF%BC%E8%87%B4%E7%9A%84%E5%83%8F%E7%B4%A0%E5%81%8F%E5%B7%AE.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。