工作忙,博客都忘了写。很多零散的知识点,虽然比较陈旧,发现还是很多人没有遇到过。今天就分享一下,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…)

窗口的实际大小是大于期望大小的,我们的红框就自然而然看不到了!

为什么会这样?

因为窗体默认的ResizeModeCanResize,系统会自动调整窗体大小。

默认窗体都是带有标题栏,系统会根据标题栏去计算客户区的大小,而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/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系