为什么Visual Studio会自动更改表单的布局?

时间:2016-05-09 07:15:32

标签: c# visual-studio visual-studio-2010 datagridview

我有一个Windows表单,其中包含3个文件:

  • AbcFrm.cs

  • AbcFrm.Designer.cs

  • AbcFrm.resx

每当我对datagridview的任何属性进行一些更改或添加新事件时,控件的大小会向右侧和底部变大,并导致控件的某些部分超出范围。

我在执行次要属性更改之前和之后比较了.Designer.cs文件(例如,将datagridview的tabStop属性值从true更改为false),并发现在.Designer中自动添加/更改了一些行/属性。 cs文件:

  • 某些控件'.Size值更改
  • 某些控件'.Location值更改
  • 某些控件'.Padding值更改
  • 表单的.AutoScaleDimensions变得更大
  • 表单的.ClientSize变得更大

修改

我意识到当我将分辨率从150%更改为125%并重新打开应用程序时,由于窗体现在具有更大的缩放尺寸,因此控件返回到正确的位置。我的问题类似于to this question

原因是代码可能已在具有不同分辨率的计算机中编辑过。然而,解决方案并不令人满意,因为它没有解决问题,只能确定原因。

如何防止这种情况发生?我正在使用Visual Studio 2010,我的操作系统是Windows 10.

4 个答案:

答案 0 :(得分:8)

推理

这是由于AutoScaleMode属性,它根据不同开发机器之间的每英寸点数(DPI)的差异来缩放winforms中对象的大小和位置。这是cannot and should not be changed的功能。有关官方文档,请参阅MSDN上的Automatic Scaling in Windows Forms

假设有两台机器,机器A和B.机器A有96 DPI,比例因子100%。机器B具有144 DPI和150%比例因子作为其推荐设置。 WinForm在机器A中创建,机器B正在尝试编辑该WinForm。

当机器B中的Visual Studio遇到该机器B的DPI与用于创建WinForm的DPI不同时,它会自动缩放WinForm中的对象,以尝试使WinForm出现在机器B中,就像它一样会看到机器A.因此,会导致WinForm.Designer.cs文件中的某些属性自动更改

解决方法

为了在没有任何自动对齐的高DPI机器中继续编辑WinForms,我们需要在高DPI机器中设置DPI以匹配用于创建WinForm的机器中的DPI。这可以通过将缩放系数调整为100%(96 DPI;右键单击桌面>显示设置)并重新启动Visual Studio(或重新登录到Windows,如果这不起作用)来完成。

注意:此处的关键是将DPI调整为用于创建WinForm的机器的原始DPI 。只是调整缩放因子可能不起作用。您可能需要使用屏幕分辨率。

答案 1 :(得分:2)

问题可能出在Visual Studio 2010或Windows 10中(取决于您如何看待它)。在Windows 7制作VS 2010之后,图形API发生了变化。然后有正常的100%DPI scalling,没有别的。也许您应该尝试安装Visual Studio 2015 Community Edition来解决问题。

修改

Currently无法锁定WinForms编辑器更改设计器文件中的设置。这实际上是预期的行为,因此定位/大小/缩放值会更改以调整当前显示设置,以便在打开自动缩放和DPI警准时可以调整值。以下是使用高DPI设置的一些好资源:

答案 2 :(得分:1)

我的解决方案是添加注册表项LogPixels并重新启动计算机。此密钥以前没有出现在我的机器上。

[HKEY_CURRENT_USER\Control Panel\Desktop] "LogPixels"=dword:00000096 

我在Windows 10上使用高分辨率显示器。我试图将我的显示设置切换回100%,但它没有任何效果。

此注册表设置对我有用。

答案 3 :(得分:1)

最近我本人也遇到了这个问题,我花了一些时间关注这些响应以及其他地方的其他资源。 在Windows 10下使用VS 2015 Pro中的VSTO工具开发Excel插件时,遇到了此问题。

在玩了很多之后,我然后创建了一个单窗体的Windows Forms解决方案,通过它我可以观察各种事物的影响,例如AutoScale属性等。 我遇到了我认为确实很奇怪的事情:

在Excel插件解决方案中,我在form.Load处理程序的第一行代码处设置了一个断点。到那时,我看到了:

Screen.PrimaryScreen.Bounds   {X=0 Y=0 Width=5760 Height=3240}

这远远超出了我系统的3840x2160屏幕分辨率。

我关闭此解决方案,然后立即打开单一形式的“测试”解决方案,该解决方案具有一个表单(Windows表单),该表单仅包含两个标签,这些标签在Load事件中用Top /对于按钮本身,具有Left / Width / Height值和标题相同的按钮。没有其他代码。在此解决方案中,在同一系统上运行,我看到:

Screen.PrimaryScreen.Bounds   {X=0 Y=0 Width=1920 Height=1080}

为什么Windows / Visual Studio会在同一台计算机上报告不同的屏幕尺寸,而绝对不对任何类型的系统设置进行更改?

基本系统设置:

  

Lenovo Yoga 920,屏幕分辨率= 3840 x 2160,缩放比例= 200%

同样,在Visual Studio中运行两种不同的解决方案之间完全没有任何改变。

任何提示或想法都将受到欢迎!

总的来说,在我看来,MS确实可以使用VS创建可移植的解决方案来塞满东西!只是我的2c ......