通过Visual Studio创建的某种形式和控件以及设计人员可以根据Windows的当前DPI /字体大小进行自我缩放。我的用户界面的一部分是一个选项卡控件,其中充满了根据用户的选择生成的动态页面和标签/输入。当这些创建时,他们使用硬编码的尺寸,看起来正确的96 DPI。WinForms不同的DPI布局
在.Net中是否有自动的方式来采取这些生成的控件,并执行设计器生成的控件执行相同的大小调整?我想避免自己扩展控件,因为这是旧代码不容易维护。
通过Visual Studio创建的某种形式和控件以及设计人员可以根据Windows的当前DPI /字体大小进行自我缩放。我的用户界面的一部分是一个选项卡控件,其中充满了根据用户的选择生成的动态页面和标签/输入。当这些创建时,他们使用硬编码的尺寸,看起来正确的96 DPI。WinForms不同的DPI布局
在.Net中是否有自动的方式来采取这些生成的控件,并执行设计器生成的控件执行相同的大小调整?我想避免自己扩展控件,因为这是旧代码不容易维护。
好吧,通过迭代选项卡页面的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);
}
您是否试过AutoScaleMode属性?
是,AutoScaleMode是什么使我的其他控件扩展完美,但它似乎并没有影响到动态控制。我还模仿设计人员在生成控件时使用的Suspend/ResumeLayout和PerformLayout调用。 – WhoaNow 2009-12-05 02:43:32
我解决了同样的问题,在运行时创建的控件根据需要,通过做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);
}
@nobugz:假设各种不同类型的标签页(每种类型都有不同的内部控件):可以将它们预先定义为UserControls:获得“form class scaling machinery”的相同优点所以:在运行时:如果用户创建一个类型为#3的新标签页:新标签页的Controls集合被设置为UserControl3停靠的新填充实例,当然这会调用UserControl的Load事件:在这种情况下,UserControl也适当缩放?谢谢, – BillW 2009-12-05 04:30:08
是的,缩放由ContainerControl实现。像Form一样,UserControl从它派生。 – 2009-12-05 10:55:33
@nobuz谢谢,我从你的答案中学到的信息,以及对UserControls的确认同样适用,非常有价值! – BillW 2009-12-06 09:36:37