C# WinForms可形成不同的DPI布局

C# WinForms可形成不同的DPI布局,c#,.net,winforms,dpi,font-size,C#,.net,Winforms,Dpi,Font Size,通过VisualStudio和设计器创建的表单和控件能够根据Windows当前的DPI/字体大小进行自我缩放。我的UI的一部分是一个选项卡控件,其中包含根据用户选择生成的动态页面和标签/输入。创建这些时,它们使用的硬编码大小看起来适合96 DPI 在.Net中是否有一种自动方式来获取这些生成的控件,并执行与设计器生成的控件相同的大小调整?我希望避免自己缩放控件,因为这是不容易维护的较旧代码。您尝试过该属性吗?好的,通过迭代选项卡页面的控件集合并将点和大小属性乘以缩放因子,在技术上很容易做到。但一

通过VisualStudio和设计器创建的表单和控件能够根据Windows当前的DPI/字体大小进行自我缩放。我的UI的一部分是一个选项卡控件,其中包含根据用户选择生成的动态页面和标签/输入。创建这些时,它们使用的硬编码大小看起来适合96 DPI


在.Net中是否有一种自动方式来获取这些生成的控件,并执行与设计器生成的控件相同的大小调整?我希望避免自己缩放控件,因为这是不容易维护的较旧代码。

您尝试过该属性吗?

好的,通过迭代选项卡页面的控件集合并将点和大小属性乘以缩放因子,在技术上很容易做到。但一旦你开始考虑码头和锚属性,这就变得非常棘手了

到目前为止,最简单的方法是让表单类缩放机制为您完成这项工作。在Load事件运行之前,需要将控件添加到选项卡页面。在构造函数中执行此操作

避免切换DPI设置以测试代码痛苦的快速提示:将此项添加到表单构造函数以调用重缩放逻辑:

protected override void OnLoad(EventArgs e) {
    this.Font = new Font(this.Font.FontFamily, this.Font.Size * 120 / 96);
    base.OnLoad(e);
}

我通过执行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);  
}

是的,AutoScaleMode使我的其他控件可以完美缩放,但它似乎不会影响动态控件。我还模拟了设计器在生成控件时使用的Suspend/ResumeLayout和PerformLayout调用。@nobugz:假设有各种不同类型的选项卡页(每种类型都有不同的内部控件):这些是否可以预定义为UserControls:以获得“表单类缩放机制”的相同好处因此:在运行时:如果用户创建一个类型为#3的新选项卡页面:新选项卡页面的控件集合被设置为一个新的UserControl3 docked'fill实例,当然,该实例调用了UserControl的“加载事件”:在这种情况下,UserControl是否也能正确伸缩?谢谢,是的,缩放是通过ContainerControl实现的。和表单一样,UserControl也是从表单中派生出来的。@nobuz谢谢,我从您的回答中了解到的信息,并且确认UserControls也是非常有价值的!