更改屏幕比例会导致按钮中的文本和图像重叠或越界

Changing screen scale causes text and image in a button to overlap or get out of bounds

我正在设计一个两列的弹出菜单。它使用 Form(作为弹出菜单容器)、TableLayoutPanel(正确排列按钮)、Button(作为弹出菜单项)和 ImageList(作为弹出菜单项的图标)。

当用户在 Windows' 100% 比例时,设计,尤其是布局符合预期:

但是,当用户使用 Windows' 150% 的比例时,弹出菜单项的位置只是分散/重叠/超出范围:
第一个例子:

第二个例子:


仅供参考,对于弹出菜单左栏中的菜单项,我设置的属性是:

FlatStyle = Flat,
ImageAlign = MiddleRight,
RightToLeft = Yes,
TextAlign = MiddleLeft,
TextImageRelation = Overlay.

弹出菜单的右栏,我设置的属性是:

FlatStyle = Flat,
ImageAlign = MiddleRight,
RightToLeft = No,
TextAlign = MiddleLeft,
TextImageRelation = Overlay.

然后,对于菜单项的文本,它们是根据 Microsoft Visual Studio 的 Text 属性设置的。对于每个菜单项的文本、快捷键的文本和图像之间的间距/填充,我只是使用空格对齐并将它们排列在一列中。


我试图做的是弄乱 TextImageRelationAutoSize=True(希望这可以自动为我正确安排布局,但没有)。然后,我还尝试将弹出菜单项的标签从使用空格更改为 String.PadRight(),因为我最初怀疑我的问题是使用空格在弹出菜单项的文本和图像之间添加填充。但是,都没有用。

然后,我发现了这个 link and also this, which are about detecting change of resolution and scale respectively, but I didn't really understand how this can help to fix my problem. Besides, if it's about Writing High-DPI Win32 Applications,我相信它已经完成/启用了。

更多信息:

//set for all the Forms
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
//.NET version used for this project
.NET version: .NET Framework 4.5.2

//dpiAwareness mode
dpiAwareness: PerMonitorV2

我也搜索了一些相关问题,但对我的帮助不大:

所以,我想就我在这里遗漏的内容寻求帮助,好吗?

在@Jimi 的指导下更改了所有必需的内容后,我终于设法解决了这个问题。

  1. 我下载了 .NET Framework 4.8 here
  2. 我从 4.5.2 -> 4.8 更改了项目的 .NET 框架。这是通过以下方式完成的:Solution Explorer -> 右键单击​​ Project's Name -> Properties -> Application 面板 -> Target framework: .NET Framework 4.8.
  3. 对于所有涉及的容器(Form),我将 AutoScaleModeFont 设置为 Dpi
  4. 在所有 Container.Designer.cs/ Form.Designer.cs 下,我将 SizeF(x) 的原始参数设置为 SizeF(96F, 96F)。例如,从 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); -> this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);

编辑完所有内容后,这些是我得到的,取决于不同的 Windows' 比例设置:

对于Scale: 100%
(一世) (二)

对于Scale: 150%
(一世) (二)


根据上面的图片,似乎没有太大区别。因此,为了能够比较,我截了一些截图并排放在一起:

谢谢!