我有一个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.
答案 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 ......