不知何故,通过 Visual Studio 和设计器创建的表单和控件具有根据 Windows 的当前 DPI/字体大小进行缩放的强大能力。我的 UI 的一部分是一个选项卡控件,其中包含根据用户的选择生成的动态页面和标签/输入。创建这些时,它们使用看起来适合 96 DPI 的硬编码大小。
.Net 中是否有一种自动方式来获取这些生成的控件并执行与设计器生成的控件相同的大小调整?我想避免自己缩放控件,因为这是不容易维护的旧代码。
好吧,通过迭代标签页的 Control 集合并将 Point 和 Size 属性乘以缩放因子,这在技术上很容易做到。但是,一旦您开始考虑 Dock 和 Anchor 属性,这将变得非常棘手。
到目前为止,最简单的方法是让 Form 类缩放机制为您完成这项工作。您需要在 Load 事件运行之前将控件添加到选项卡页。在构造函数中执行此操作。
避免切换 DPI 设置以测试代码的痛苦的快速提示:将其添加到表单构造函数以调用重新缩放逻辑:
protected override void OnLoad(EventArgs e) {
this.Font = new Font(this.Font.FontFamily, this.Font.Size * 120 / 96);
base.OnLoad(e);
}
您是否尝试过AutoScaleMode属性?
我解决了同样的问题,根据需要在运行时创建控件,通过执行 Designer.cs 所做的操作:
void CreateRuntimePanel()
{
//instantiate controls here...
//suspend layouts
//begin inits
this.SuspendLayout();
//set control properties here
//before adding any control to form's Controls collection, do this
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
//add controls to form's Controls collection here
//resume layouts
//end inits
this.ResumeLayout(false);
}