关于WinForms的跨显示器DPI自适应

导语

WinForms 是运行在 Windows 上的传统 .NET 桌面应用技术框架。由于历史原因,它在高 DPI 和跨不同 DPI 屏幕的支持方面存在一些问题,本文将探讨解决这些问题的可能方案。

Windows 的“黑历史”

Windows 系统的默认 DPI(更准确地说是 PPI)为 96。PPI 指的是每英寸像素数(Pixels per inch),数值越高,表示屏幕的显示效果越细腻。

然而,这意味着在高 PPI 屏幕上显示与低 PPI 屏幕相同尺寸的图像时,需要更多的像素来填充。对于非矢量图来说,这个问题难以解决,因为图像在高像素拉伸时会变得模糊。类似的问题也出现在 Windows 中,特别是那些仅考虑 96 PPI 设计的老程序。微软的一篇博客详细解释了这个历史原因:

https://www.php.cn/link/6a8ceeefa2c42b104a67547efbe79c9d

例如,在 150% DPI 的屏幕上,Windows 管理控制台(MMC)会出现模糊现象。(在微信或网页上可能不明显)

而在 100% DPI 的屏幕上,图像是清晰的。

关于WinForms的跨显示器DPI自适应Windows 10 的努力

由于高分辨率屏幕(HDPI)的普及,Windows 10 每半年一次的功能更新(Feature Update)一直在努力解决 DPI 问题。我们可以通过下图中的设置组合,解决许多老程序的 DPI 适配问题。但要实现跨屏幕 DPI 自适应仍然非常困难。

关于WinForms的跨显示器DPI自适应关于WinForms的跨显示器DPI自适应所谓跨屏幕 DPI 自适应(Per Monitor-DPI aware),指的是当电脑连接外部屏幕时,Windows 会选择适配该屏幕的 DPI 来显示图像。外部屏幕的 DPI 可能与电脑主屏幕的 DPI 不同。例如,使用 Surface Pro 连接一个 1920×1080 分辨率的 22 英寸显示器,Surface 的主屏幕通常是 150% 以上的 DPI,而外部显示器是 100%。

如果程序本身不支持 Per Monitor-DPI aware,那么即使使用 Windows 自带的兼容模式调整,两个屏幕上的图像虽然清晰,但应用界面在低 DPI 屏幕上会被放大,并不完美。因此,最理想的解决方案是开发支持 Per Monitor-DPI aware 的程序。

微软自己的应用也在这方面进行了改进。例如,从 Visual Studio 2019 开始已经天然支持 Per Monitor-DPI aware。(要求 Windows 10 v1803 及 .NET Framework 4.8)

关于WinForms的跨显示器DPI自适应WinForms 能否救赎?

Windows 桌面开发最本土的三种技术分别是:WinForms、WPF、UWP。由于 UWP 诞生于现代,因此天生没有 DPI 适配问题,而 WPF 的 XAML 界面也可以轻松适配 DPI。唯独 WinForms 由于历史包袱太重,必须进行改进。我们来尝试一下是否能救赎它。

首先,我在 VS2019 中使用 150% DPI 的主屏幕,设计器视图不模糊,但按钮尺寸有问题,控件位置如下:

关于WinForms的跨显示器DPI自适应注意红色箭头位置。在 VS 中一切正常。然而运行起来,在 150% DPI 的主屏幕上会模糊,并且控件错位。

关于WinForms的跨显示器DPI自适应将窗口拖动到 100% DPI 的屏幕上,UI 不模糊,但控件依然错位。

芦笋演示 芦笋演示

一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。

芦笋演示 34 查看详情 芦笋演示

关于WinForms的跨显示器DPI自适应根据微软官方文档 https://www.php.cn/link/a47cbe66c8ef5ec4ec54aea47c6ef401 的描述,.NET Framework 从 4.7 开始改善了 WinForms 的 DPI 支持。因此,第一步,我将该程序的运行时改为 4.7.2(Windows 10 1803 以上版本自带)。

在应用根目录添加一个 app.manifest 文件。

关于WinForms的跨显示器DPI自适应取消注释其中的 assembly/compatibility/application 下的 Windows 10 GUID。

然后在 App.config 文件中添加:

windows.forms.applicationconfigurationsection>

现在发现控件位置在 150% DPI 的主屏幕上正确显示,整个 UI 不模糊。

关于WinForms的跨显示器DPI自适应但是在 100% DPI 的屏幕上,虽然 UI 不模糊,但控件位置依然不正确,并且 TextBox 变得巨大。

关于WinForms的跨显示器DPI自适应微软文档中没有提到其他方法。但是我发现将运行时改为 .NET Framework 4.8 可以修复 TextBox 的大小问题,但控件位置依然不正确。

关于WinForms的跨显示器DPI自适应经过仔细观察,发现问题并不在于 TextBox、Label、Checkbox 这些控件,而是 MonthCalendar 在 100% DPI 的屏幕上比 150% 的主屏宽。并且 Panel、TableLayoutPanel 和 Dock 的组合也无法解决这个问题。

.NET Core 3.0 能解决吗?

.NET Core 3.0 目前处于预览 6 阶段。从我的实验结果来看,它的 DPI 适配不需要 App.config,而是在 Program.cs 中加入:

Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);

但最终效果与 .NET Framework 4.8 相同,虽然跨 DPI 屏幕界面不会模糊,但 MonthCalendar 的宽度问题依旧存在。

结论

在 Windows 10 v1903 上(其他版本我未测试),通过 .NET Framework 4.8 + app.manifest + app.config 的配置,可以在一定程度上使 WinForms 具有 Per Monitor-DPI aware 的能力,但部分控件的尺寸仍然会不同。因此,在发布程序之前需要仔细测试,确保 UI 的可用性,再向用户提供跨屏幕 DPI 自适应支持。

我的示例程序代码:https://www.php.cn/link/7f97b7749c6cc6af94fddb1898de78d4

以上就是关于WinForms的跨显示器DPI自适应的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/457295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 02:02:21
下一篇 2025年11月8日 02:03:01

相关推荐

  • XML中如何生成XML报表模板_XML生成XML报表模板的方法与示例

    利用XSLT、编程语言或模板引擎可生成XML报表模板:1. XSLT将源XML转换为结构化报表;2. Python等语言通过DOM操作动态构建XML;3. Jinja2等模板引擎支持变量与逻辑控制,实现灵活输出。 在XML中生成XML报表模板,实际上是指利用XML的结构化特性设计一个可复用的数据模板…

    2025年12月17日
    000
  • XML中如何解压XML字符串_XML解压XML字符串的操作方法

    先解压再解析XML。C#用GZipStream解压字节流并转字符串,Java用GZIPInputStream或InflaterInputStream读取压缩数据,结合StreamReader或BufferedReader还原为明文XML后,交由XDocument或DocumentBuilder解析;…

    2025年12月17日
    000
  • 如何转换XML到数据库表

    答案:XML转数据库需分析结构、设计表、选择解析技术并处理数据类型与性能。首先解析XML层次结构,映射实体为表,属性为列,嵌套元素转子表;选用DOM或SAX等工具,结合Python、Java等语言实现ETL;注意数据类型转换、缺失值、主键设计及范式权衡;面对大文件用流式解析与批量插入优化性能,确保事…

    2025年12月17日
    000
  • XML Schema数据类型有哪些?如何定义?

    XML Schema提供内置数据类型和自定义类型机制,用于约束XML文档结构。常见内置类型包括xs:string、xs:int、xs:date等,支持通过限制取值范围或枚举,如定义Gender枚举和Age范围;使用定义包含子元素和属性的复杂结构,如Person类型包含FirstName、LastNa…

    2025年12月17日
    000
  • XML中如何处理属性冲突_XML处理属性冲突的方法与技巧

    属性冲突源于多命名空间同名属性、重复定义或默认值与显式赋值矛盾,可通过命名空间前缀区分来源、XSD/Schema约束定义及解析时优先级规则有效避免。 在XML文档中,属性冲突通常发生在多个命名空间或重复定义的属性导致解析困难时。正确处理这些冲突对保证数据完整性和解析效率至关重要。 理解属性冲突的来源…

    2025年12月17日
    000
  • XML与SVG图像格式有何关系?如何嵌入?

    SVG是基于XML的矢量图形格式,使用XML标签定义图形元素,如圆形、矩形等,具有结构清晰、可读性强的特点。例如,一个蓝色圆的SVG代码即为符合XML语法的文本文件。在网页中,SVG可通过多种方式嵌入:1. 直接内联嵌入,便于样式和脚本控制;2. 使用img标签引用外部SVG文件,适用于静态图像;3…

    2025年12月17日
    000
  • RSS订阅如何过滤重复内容

    RSS去重核心是利用guid、link或内容哈希识别唯一性,结合已处理记录实现过滤。主流阅读器如Inoreader和Feedly通过后端比对guid/link进行自动去重;自建方案可用Python脚本解析RSS并以数据库存储条目标识,通过定时任务抓取新内容并生成去重后的输出流。 RSS订阅中遇到重复…

    2025年12月17日
    000
  • XML标准化组织有哪些?W3C角色是什么?

    W3C是XML标准的源头和主导力量,于1998年发布XML 1.0规范,定义了XML语言基础并推动其发展;OASIS、ISO和IETF等组织在企业应用、国际标准对接和协议支持等方面协同扩展XML应用,共同促进结构化数据在Web和企业系统中的广泛使用。 在XML(可扩展标记语言)的发展和标准化过程中,…

    2025年12月17日
    000
  • XML数据库是什么?如何存储XML数据?

    原生XML数据库如eXist-db和BaseX直接存储XML层次结构,支持XPath/XQuery查询;关系数据库则通过XML字段或分解为表结构来管理XML数据,存储方式包括纯文本、分解、混合型和二进制序列化,选择需根据数据结构稳定性、查询需求和性能权衡。 XML数据库是一种专门设计用来存储、查询和…

    2025年12月17日
    000
  • XML格式的化学分子式标准

    XML格式的化学分子式标准优势在于结构化、可扩展和自描述性,便于数据交换与解析;通过定义XML Schema(XSD)可验证文件有效性,确保元素和属性符合规范;其在化学信息学中广泛应用于分子式、反应、性质及文献元数据的标准化表示与系统间共享。 XML格式的化学分子式标准,简单来说,就是一种用XML来…

    2025年12月17日
    000
  • XML Schema有何作用?如何定义XSD文件?

    XML Schema用于定义XML文档结构、元素、属性及数据类型,支持命名空间和复杂约束,通过XSD文件实现数据校验与规范。 XML Schema(XML 模式)用于定义 XML 文档的结构、元素、属性及其数据类型,确保 XML 内容符合预设规则。相比 DTD,XML Schema 支持数据类型、命…

    2025年12月17日
    000
  • XML中如何比较XML差异_XML比较XML差异的操作方法

    使用专业工具或编程方法可准确比较XML差异。推荐DiffDog、XMLSpy进行图形化对比,WinMerge配合插件实现免费开源比对;Python的ElementTree、Java的DOM解析器适用于自动化代码比对,需先格式化避免空白干扰;命令行可用xmlstarlet结合diff,git可通过.x…

    2025年12月17日
    000
  • XPath如何选择祖先节点? XPath遍历祖先节点的路径表达式详解

    XPath通过ancestor::和ancestor-or-self::轴选择祖先节点,前者选取所有上级节点,后者包含当前节点本身;结合谓词可精确筛选特定类型或层级的祖先,常用于定位深层嵌套元素的容器,但需注意性能开销与结构依赖性。 XPath选择祖先节点主要依赖于ancestor::和ancest…

    2025年12月17日 好文分享
    000
  • 什么是XML Encryption

    XML Encryption通过加密XML数据保障机密性,支持细粒度加密,利用CEK和KEK双重加密机制,结合和结构实现安全封装,并常与XML Signature协同使用以同时确保机密性、完整性和认证。 XML Encryption 是一种由万维网联盟(W3C)定义的技术标准,它允许我们对整个 XM…

    2025年12月17日
    000
  • RSS源如何推广?提交到聚合器方法?

    提交到主流聚合器是推广RSS源的关键,可通过Feedly、The Old Reader、Inoreader等平台增加曝光;确保RSS格式规范以提高收录成功率。在网站显眼位置放置标准RSS图标并链接至订阅地址,有助于用户手动订阅。结合社交媒体、邮件列表和开发者社区(如GitHub)宣传RSS源,可吸引…

    2025年12月17日
    000
  • XML与配置文件格式对比?如INI、YAML。

    XML适合复杂数据和企业级应用,但冗长;INI简单直观,适用于基础配置;YAML可读性好、结构灵活,适合现代开发,三者依需求选择。 XML、INI 和 YAML 都是常见的配置文件格式,各有特点,适用于不同场景。选择哪种格式主要取决于可读性、结构复杂度、解析难度和使用环境。 1. XML:结构严谨,…

    2025年12月17日
    000
  • XSLT如何验证输入? XSLT转换前输入数据合规性检查的实操步骤

    XSLT通过XSD在转换前验证输入,确保数据结构和类型正确,防止错误。使用XSD定义XML结构,结合Java等工具验证,可捕获异常并阻止无效转换。此外可用DTD、Schematron或自定义XSLT逻辑验证,但XSD最常用。复杂类型支持数据格式、范围及正则约束,如邮箱校验。性能方面,建议缓存Sche…

    2025年12月17日
    000
  • 如何实现XML版本控制

    XML版本控制需结合Git/SVN与专用工具,因XML结构特性使传统行级diff产生大量无意义差异,无法准确识别语义变化。核心在于使用能解析树形结构的工具(如Oxygen XML Editor、DeltaXML)进行差异比较与合并,避免格式化或属性顺序变动造成的“噪音”。同时应标准化XML格式、利用…

    2025年12月17日
    000
  • RSS验证器是什么?如何检查有效性?

    验证RSS feed可确保其格式正确,避免订阅失败或内容丢失。通过工具如W3C Feed Validation Service检查XML语法、必填字段、日期格式等,提升与阅读器的兼容性。常见问题包括无效XML、缺失字段和编码错误,需定期验证以保障稳定性。 RSS验证器是一种用于检测RSS订阅源是否符…

    2025年12月17日
    000
  • XML与配置文件热重载如何实现?监听文件变化。

    实现XML配置热重载需监听文件变化、重新解析并安全替换配置。首先利用WatchService等工具监听文件修改事件;检测到变更后,异步重新解析XML,校验语法并对比新旧配置;通过原子引用或双缓冲机制更新内存配置,避免阻塞主线程和频繁抖动;最后通知相关组件同步状态。结合Spring Boot或配置中心…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信