为啥 Visual Studio 会自动更改我的表单布局?
Posted
技术标签:
【中文标题】为啥 Visual Studio 会自动更改我的表单布局?【英文标题】:Why does Visual Studio automatically changes the layout of my form?为什么 Visual Studio 会自动更改我的表单布局? 【发布时间】:2016-05-09 07:15:32 【问题描述】:我有一个包含 3 个文件的 Windows 表单:
AbcFrm.cs
AbcFrm.Designer.cs
AbcFrm.resx
每当我对 datagridview 的任何属性进行一些更改或添加新事件时,控件的大小都会在右侧和底部变大,并导致控件的某些部分超出范围。
我比较了 .Designer.cs 文件在我执行较小的属性更改之前和之后(例如,将 datagridview 的 tabStop 属性值从 true 更改为 false),并发现在 .Designer 中自动添加/更改了一些行/属性。 .cs 文件:
一些控件的.Size
值变化
一些控件的.Location
值变化
一些控件的.Padding
值变化
表单的.AutoScaleDimensions
变大了
表单的.ClientSize
变大了
编辑
我意识到,当我将分辨率从 150% 更改为 125% 并重新打开应用程序时,控件又回到了正确的位置,因为 Windows 窗体现在具有更大的缩放大小。我的问题类似to this question
原因是代码可能是在不同分辨率的计算机中编辑的。但是,解决方案并不令人满意,因为它没有解决问题,只是找出原因。
如何防止这种情况发生?我正在使用 Visual Studio 2010,我的操作系统是 Windows 10。
【问题讨论】:
不知道为什么这样做。您可以将当前的Size
粘贴到MaximumSize
属性中,从而防止其增长。虽然不知道如何处理Location
@MickyD this problem is similar 但解决方案意味着更改显示器的分辨率......这并不令人满意
同意。您是否对控制面板中的更轻松地阅读屏幕上的内容进行了更改?
@MickyD 你这是什么意思?默认情况下,我的屏幕分辨率为 1920 x 1080 或 150%,这是 14 英寸屏幕的推荐分辨率。任何较小的东西都会使阅读屏幕上的内容变得非常困难。
如果有一个设置可以防止对 .Designer.cs 文件进行不必要的更改,那就太好了。
【参考方案1】:
推理
这是由于 AutoScaleMode 属性根据不同开发机器之间的每英寸点数 (DPI) 的差异来缩放 Winform 中对象的大小和位置。这是cannot and should not be changed 的一项功能。有关官方文档,请参阅 MSDN 上的Automatic Scaling in Windows Forms。
假设有两台机器,机器 A 和 B。机器 A 的 DPI 为 96,缩放因子为 100%。机器 B 的推荐设置为 144 DPI 和 150% 缩放系数。在机器 A 中创建了一个 WinForm,机器 B 正在尝试编辑该 WinForm。
当机器 B 中的 Visual Studio 遇到机器 B 的 DPI 与用于创建 WinForm 的 DPI 不同时,它会自动缩放 WinForm 中的对象以尝试使 WinForm 在机器 B 中显示为它在机器中的外观一个。因此,这会导致WinForm.Designer.cs
文件中的某些属性自动更改。
解决方法
为了在没有任何自动对齐的情况下在高 DPI 机器中继续编辑 WinForms,我们需要在高 DPI 机器中设置 DPI 以匹配用于创建 WinForm 的机器中的 DPI。这可以通过将缩放因子调整为 100%(96 DPI;右键单击桌面 > 显示设置)并重新启动 Visual Studio(或重新登录到 Windows,如果这不起作用)来完成。
注意:这里的关键是将 DPI 调整为用于创建 WinForm 的机器的原始 DPI。仅仅调整比例因子可能不起作用。您可能需要调整屏幕分辨率。
【讨论】:
在带有 Visual Studio 2013 的 Windows 10 上更改比例因子对我有用。我有一个三显示器设置,其中我的笔记本显示器具有高 DPI,它是主显示器。即使我的 VS 在另一台显示器上运行,我也不得不将其比例因子降低到 100%。【参考方案2】:问题可能在于 Visual Studio 2010 或 Windows 10(取决于您如何看待它)。在 VS 2010 制作的 Windows 7 之后,图形 API 发生了变化。然后正常有 100% DPI 缩放,仅此而已。也许您应该尝试安装Visual Studio 2015 Community Edition,这应该可以解决问题。
编辑:
Currently 无法锁定 WinForms 编辑器以防止更改设计器文件中的设置。这实际上是预期的行为,因此定位/大小/缩放值会更改以调整当前显示设置,因此如果启用了自动缩放和 DPI 警告,则可以调整这些值。以下是一些使用高 DPI 设置的好资源:
WinForms Scaling at Large DPI Settings–Is It Even Possible? When using the WinForms designer, do I always need to have DPI set to 96? Cannot disable DPI scaling for Visual Studio 2012 Visual Studio extensions and DPI-awareness【讨论】:
【参考方案3】:我的解决方案是添加注册表项LogPixels
并重新启动机器。我的机器上以前不存在此密钥。
[HKEY_CURRENT_USER\Control Panel\Desktop] "LogPixels"=dword:00000096
我使用的是具有高分辨率显示屏的 Windows 10。我尝试将显示设置切换回 100%,但没有任何效果。
此注册表设置对我有用。
【讨论】:
仅仅改变比例因子可能不起作用。您可能还需要使用屏幕分辨率。因此,如果您知道表单最初创建或最后保存的分辨率和缩放因子也会非常有帮助,因为到那时您不需要做任何猜测。【参考方案4】:最近我自己也遇到了这个问题,我也花了一些时间关注这些回复以及其他地方的其他资源。 我在 Windows 10 下使用 VS 2015 Pro 中的 VSTO 工具开发 Excel 插件时遇到了这个问题。
玩了一段时间后,我创建了一个单一形式的 Windows 窗体解决方案,我可以使用它来观察各种事物的效果,例如 AutoScale 属性等。 我遇到了一些我认为很奇怪的事情:
在 Excel 插件解决方案中,我在 form.Load 处理程序的第一行代码处设置了一个断点。那时,我明白了:
Screen.PrimaryScreen.Bounds X=0 Y=0 Width=5760 Height=3240
这很有趣,远远超出了我系统上的屏幕分辨率,即 3840x2160。
我关闭此解决方案并立即打开单一表单“测试”解决方案,该解决方案有一个表单(Windows 表单),其中只有 2 个标签,在 Load
事件中填写 Top
/Left
/ Width
/Height
值和标题相同的按钮,用于按钮本身。没有任何其他代码。在这个解决方案中,在同一个系统上运行,我看到:
Screen.PrimaryScreen.Bounds X=0 Y=0 Width=1920 Height=1080
为什么 Windows / Visual Studio 会在同一台机器上报告不同的屏幕尺寸,而对系统设置完全没有任何更改?
基本系统设置:
联想 Yoga 920,屏幕分辨率 = 3840 x 2160,缩放 = 200%
同样,在 Visual Studio 中运行两种不同的解决方案之间完全没有任何变化。
欢迎任何提示或想法!
总体而言,在我看来,MS 在能够使用 VS 创建可移植解决方案方面确实做得很好!只是我的 2c....
【讨论】:
【参考方案5】:我在另一台使用其他 DPI 设置的计算机上编辑的程序也遇到了同样的问题。我根据this tutorial on DPI 找到的解决方法是在 Designer.vb 上找到以下几行(在 vb 网络上工作)
Me.AutoScaleDimensions = New System.Drawing.SizeF(8.0!, 16.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
将它们注释掉,通过添加将自动缩放更改为无:
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None
并重建并重新运行程序。控制又回到了原位。之后,我通过取消注释上面的代码将 AutoScaleDimensions 设置回原始值,并将 AutoScaleMode 设置回 Font,一切正常。 WinForms 通过自己的缩放机制实现 DPI 缩放,该机制计算表单设计所在的系统与运行它的系统之间的缩放差异。(如前述tutorial 中所述) .我看到上面的解决方法重置了创建表单的机器的比例因子。
【讨论】:
以上是关于为啥 Visual Studio 会自动更改我的表单布局?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Visual Studio 不将我的更改应用于 HTML 文件?
如何防止 Visual Studio 更改我的 csproj 格式