将开发从 100% 的 Windows 缩放转移到 150% 的 WinForms 窗口
Posted
技术标签:
【中文标题】将开发从 100% 的 Windows 缩放转移到 150% 的 WinForms 窗口【英文标题】:Moving development from 100% Windows scaling to 150% chops WinForms window 【发布时间】:2019-04-24 10:56:54 【问题描述】:我在 Visual Studio 2010 中使用 C# Winforms。由于我已将笔记本电脑从旧的 1366 x 768 分辨率笔记本电脑升级到分辨率为 1920x1080 的新笔记本电脑,因此在新笔记本电脑上继续开发时发现了一个问题。我将问题归结为新的 150% Windows 操作系统范围的缩放(旧笔记本电脑上的 Windows 使用 100% 缩放)。当我运行程序时,窗口的右侧被奇怪地切掉了。
这是旧笔记本电脑上的工作版本(1000 像素宽,或在 150% 缩放的 Windows 模式下为 1500 像素):
这是新笔记本电脑上的新版本,带有切碎的窗口(1286 像素宽,由于 150% 缩放,它应该是 1500 像素)。
立即将项目加载到新的 150% 缩放的 Windows 设置并运行程序后,它似乎工作正常,但只要您移动其中一个按钮以便 VS 更新设计器代码(按钮 5 被移动为可以看到),然后运行,窗口被砍了。
即使手动进入 Form1.Designer.cs 代码,并将 ClientSize 调整为像ClientSize = new System.Drawing.Size(3000, 709);
这样的愚蠢的高水平值,也会导致窗口宽度最多限制为 1286 像素。 (不是这样)巧合的是,1286 大约是 1920 / 1.5。
基本上,到底发生了什么?这似乎是 VS 缩放管理的一个错误。需要明确的是,在任何系统上将开发从 100% Windows 缩放屏幕移动到 150% Windows 缩放屏幕时都会出现问题。您不需要两台笔记本电脑即可重现该问题,所有问题都可以在一台笔记本电脑上重现(但请确保在切换到 100% 或 150% 后退出并进入 Windows)。
最后,要明确一点,我知道如何使用 app.manifest
文件将 DPI 感知设置设置为 true。虽然这可以让文本更清晰并解决切碎的窗口问题,但我不想走这条路,因为我的程序 GUI 的变化不一致,例如重叠控件和某些设置上的错位项目。
【问题讨论】:
您可能需要考虑使用TableLayoutPanel 来定位按钮而不是绝对位置。这解决了这样的问题。 @ScottChamberlain:主要问题是被截断的窗口大小,而不是控件位置的问题。 一切都固定在左上角。您需要锚定到正确的一侧(右上角、左下角等。不过中间 3 仍然是个问题)或使用网格使锚点随表单大小移动。 表单被缩放两次。首先由 winforms 管道从 150% 到 100%。然后由操作系统的 dpi 虚拟化备份。缩小规模通常是有问题的。 “切碎的窗口”问题是由 Winforms 看到 dpi 虚拟化提供的伪造监视器大小引起的。您的表单的设计尺寸太大了。所以它减小了尺寸以适应。是的,您可以称其为错误,它应该在 缩小后应用限制。不是唯一可能出错的事情,100% 设计,因此只能扩大规模,这当然是最实用的解决方案。 没有解决方法。对于微软来说也不容易修复,这就是它没有得到修复的原因。密切关注新的框架版本是明智的,所有最近的版本都有 dpi 问题调整。但是能够在 dpi 虚拟化模式下切换 VS2017 是他们举手的强烈暗示,顺便说一句,缩小问题是非常基本的。文本在较低的字体点大小下需要按比例增加空间,讨厌。 【参考方案1】:到目前为止,我已经找到了两个半解决方案:
首先是升级到 Visual Studio 2017(即使在 150% 的 Windows 缩放中,您也可以在 VS Forms 设计器中强制 100% 缩放)
其次是与早期版本的 Visual Studio(包括 VS 2010)保持一致,但要确保将 Windows 设置为 100% 缩放。如果您刚刚更改了缩放设置,请确保注销并重新登录 Windows,以确保正确应用缩放。
【讨论】:
【参考方案2】:一个相对简单的解决方法是创建一个Panel
控件,它是您想要的窗口大小,将其发送到第一层(在设计器中右键单击控件> 发送到后面)。然后将表单设置为AutoResize
以适应该控件。 (也将AutoSizeMode
设置为GrowAndShrink
,以防表单看起来比应有的大)
如果您需要Fixed
表单,这非常有用,但对于Resizable
表单,您可能需要一些额外的代码来在表单的调整大小事件发生时调整此面板的大小。
【讨论】:
以上是关于将开发从 100% 的 Windows 缩放转移到 150% 的 WinForms 窗口的主要内容,如果未能解决你的问题,请参考以下文章