WinForms不同的DPI布局

以某种方式通过Visual Studio创建的表单和控件,设计器具有很强的自我扩展能力,具体取决于Windows的当前DPI /字体大小。 我的UI的一部分是一个标签控件,其中包含动态页面和标签/输入,具体取决于用户的选择。 创建这些时,它们使用的硬编码尺寸适合96 DPI。

在.Net中是否有自动方式来获取这些生成的控件并执行与设计器生成的控件相同的resize? 我想避免自己扩展控件,因为这是旧代码不易维护。

好吧,通过迭代标签页的控件集合并将点和大小属性乘以缩放因子,技术上很容易。 但是,一旦开始考虑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); }