2009-12-05 103 views
4

通过Visual Studio创建的某种形式和控件以及设计人员可以根据Windows的当前DPI /字体大小进行自我缩放。我的用户界面的一部分是一个选项卡控件,其中充满了根据用户的选择生成的动态页面和标签/输入。当这些创建时,他们使用硬编码的尺寸,看起来正确的96 DPI。WinForms不同的DPI布局

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

回答

9

好吧,通过迭代选项卡页面的Control集合并将比例和大小属性乘以比例因子在技术上很容易。但是一旦你开始考虑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); 
} 
+0

@nobugz:假设各种不同类型的标签页(每种类型都有不同的内部控件):可以将它们预先定义为UserControls:获得“form class scaling machinery”的相同优点所以:在运行时:如果用户创建一个类型为#3的新标签页:新标签页的Controls集合被设置为UserControl3停靠的新填充实例,当然这会调用UserControl的Load事件:在这种情况下,UserControl也适当缩放?谢谢, – BillW 2009-12-05 04:30:08

+2

是的,缩放由ContainerControl实现。像Form一样,UserControl从它派生。 – 2009-12-05 10:55:33

+0

@nobuz谢谢,我从你的答案中学到的信息,以及对UserControls的确认同样适用,非常有价值! – BillW 2009-12-06 09:36:37

0

您是否试过AutoScaleMode属性?

+0

是,AutoScaleMode是什么使我的其他控件扩展完美,但它似乎并没有影响到动态控制。我还模仿设计人员在生成控件时使用的Suspend/ResumeLayout和PerformLayout调用。 – WhoaNow 2009-12-05 02:43:32

0

我解决了同样的问题,在运行时创建的控件根据需要,通过做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); 
}