起因
使用SmartPhone上的WinForm做了一个WM的小程序,结果放到手机上实际一运行。发现动态生成的控件在里面显示得都非常小,难以看清。
原因
我的问题是需要在InitializeComponent方法结束后,动态生成一些控件,如下:
/// <summary>
/// 这个方法会根据传入的实体模型,生成一些选择框,设置它们的大小、位置;并会改变其它控件的大小、位置。
/// </summary>
/// <param name="categories"></param>
private void GenerateCheckBoxes(IList<Category> categories)
{
……
}
原因就是因为手机分辨率较大,而这些动态生成的控件并没有进行随着分辨率不同而进行自动缩放。而由界面设计器设计出来的控件,都能很好的显示。
求索
由于界面生成的控件能够很好的自适应分辨率的不同,所以先看一下Designer生成的代码:
private void InitializeComponent()
{
this.BAdd = new System.Windows.Forms.Button();
this.PCategories = new System.Windows.Forms.Panel();
this.SuspendLayout();
// BAdd
this.BAdd.Location = new System.Drawing.Point(165, 164);
this.BAdd.Name = "BAdd";
this.BAdd.Size = new System.Drawing.Size(72, 20);
this.BAdd.TabIndex = 11;
this.BAdd.Text = "Add";
this.BAdd.Click += new System.EventHandler(this.BAdd_Click);
// PCategories
this.PCategories.Location = new System.Drawing.Point(73, 83);
this.PCategories.Name = "PCategories";
this.PCategories.Size = new System.Drawing.Size(164, 75);
// MainForm
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.AutoScroll = true;
this.ClientSize = new System.Drawing.Size(243, 258);
this.Controls.Add(this.PCategories);
this.Controls.Add(this.BAdd);
this.Name = "MainForm";
this.Text = "MoneyManagerForm";
this.ResumeLayout(false);
}
这里的重点是使用了AutoScaleDimensions和AutoScaleMode属性来设置界面为自动缩放。(Dpi表示Dot per inch,WPF就是直接使用这种方式来控制界面的。)然后最后一步调用ResumeLayout方法,这个方法中,会调用到 ContainerControl.PerformAutoScale方法进行自动缩放。
最可恶的一点:从控件的构造,到界面的自动缩放,全部在一个方法中实现!而且这个方法中,没有什么好的办法来调用我生成控件的方法……