C# 将开发从100%的窗口扩展到150%的WinForms窗口

C# 将开发从100%的窗口扩展到150%的WinForms窗口,c#,winforms,visual-studio-2010,scaling,dpi,C#,Winforms,Visual Studio 2010,Scaling,Dpi,我在VisualStudio2010中使用C#Winforms。由于我已将我的笔记本电脑从旧的1366 x 768分辨率升级为新的1920 x1080分辨率的笔记本电脑,我在继续开发新笔记本电脑时注意到了一个问题。我将问题归结为新的150%Windows操作系统范围的扩展(旧笔记本电脑上的Windows使用100%的扩展)。当我运行程序时,窗口的右侧奇怪地被切断 这是旧笔记本电脑上的工作版本(1000像素宽,或150%缩放Windows模式下的1500像素): 这是新笔记本电脑上的新版本,带有

我在VisualStudio2010中使用C#Winforms。由于我已将我的笔记本电脑从旧的1366 x 768分辨率升级为新的1920 x1080分辨率的笔记本电脑,我在继续开发新笔记本电脑时注意到了一个问题。我将问题归结为新的150%Windows操作系统范围的扩展(旧笔记本电脑上的Windows使用100%的扩展)。当我运行程序时,窗口的右侧奇怪地被切断

这是旧笔记本电脑上的工作版本(1000像素宽,或150%缩放Windows模式下的1500像素):

这是新笔记本电脑上的新版本,带有切碎窗口(1286像素宽,由于150%的缩放比例,应该是1500像素)

立即将项目加载到新的150%缩放的Windows设置中并运行该程序后,它似乎工作正常,但只要移动其中一个按钮,以便VS更新设计器代码(如您所见,按钮5已移动),然后运行,该窗口就会被截断

即使手动进入Form1.Designer.cs代码,并将ClientSize调整为愚蠢的高水平值,如
ClientSize=new System.Drawing.Size(3000709)导致窗口宽度最多限制为1286像素。(并非如此)巧合的是,1286大约是1920/1.5

基本上,到底发生了什么?这看起来像是VS缩放管理的一个bug。需要明确的是,在任何系统上,将开发从100%Windows缩放屏幕移动到150%Windows缩放屏幕时都会出现问题。您不需要两台笔记本电脑来重现问题,所有问题都可以在一台笔记本电脑上重现(但请确保在从/切换到100%或150%后注销并进入Windows)


最后,要明确的是,我知道如何使用
app.manifest
文件将DPI感知设置设置为true。虽然这样可以使文本更清晰,并解决了切碎窗口的问题,但我不想走这条路,因为我的程序GUI中的更改不一致,例如控件重叠和某些设置上的项目错位。

到目前为止,我已经找到了两个半解决方案:

首先是升级到Visual Studio 2017(这允许您在VS Forms designer中强制进行100%的缩放,即使在150%的Windows缩放中也是如此)


第二个是保持早期版本的VisualStudio(包括VS2010),但要确保Windows设置为100%缩放。如果您只是更改了缩放设置,请确保在Windows中退出并确保适当地使用缩放。

您可能想考虑使用A来定位按钮而不是绝对位置。这就解决了这样的问题。@ScottChamberlain:主要问题是窗口的大小被截断了,而不是控件的位置问题。所有内容都定位在左上角。您需要定位到正确的一侧(右上角、左下角等。但是中间的3个仍然是一个问题),或者使用网格使定位点随表单大小移动。表单缩放两次。首先,winforms管道从150%增加到100%。然后通过操作系统的dpi虚拟化进行备份。缩小规模通常是有问题的。“切碎窗口”问题是由Winforms看到dpi虚拟化提供的假监视器大小引起的。你的表单的设计尺寸太大了。因此,它缩小了尺寸以适合。是的,你可以称之为bug,它应该在缩小比例后应用限制。并不是唯一会出错的事情,100%设计,所以它只能放大,这肯定是最实际的解决方案。没有解决办法。对微软来说也不容易修复,这就是为什么它没有得到修复。关注新的框架版本是明智的,最近的所有版本都有dpi问题的调整。但是能够在dpi虚拟化模式下切换VS2017是一个强烈的暗示,顺便说一句,向下扩展的问题是非常基本的。字体点大小越小,文本需要的空间就越大。