參考:http://yefenme.blog.163.com/blog/static/13069770420132283644288/spa
自適應首先考慮的是AutoScaleMode屬性設置,其中=DPI對於圖片控件來講頗有效果,可是其餘的就沒用了,所以用參考文章中的幫助類AutoSizeFormClass。code
可是在實際應用中發現控件都亂了,一時沒找到具體問題所在。後來細細看來,發現個人代碼中有動態添加的控件,而參考文章中的初始化獲取控件Size是在FormLoad中進行調用controllInitializeSize()的,致使控件數目不對。在動態添加控件時進行獲取就能夠達到想要的效果。orm
可是對於一些Label等控件顯示大小與Width,Height值沒有關係,只是和Font.Size大小相關,所以還須要特殊處理一番,添加方法以下:blog
Dictionary<string, List <int>> dgvCols = new Dictionary<string, List<int>>(); Dictionary<string, float> LabelFonts = new Dictionary<string, float>(); Dictionary<string, float> RadioButtonFonts = new Dictionary<string, float>();
public void controllInitializeSize_Special(Control mForm) { AddControlInfo_Special(mForm); }
private void AddControlInfo_Special(Control ctl) { foreach (Control c in ctl.Controls) { if (c.Controls.Count > 0) AddControlInfo_Special(c);//窗體內其他控件還可能嵌套控件(好比panel),要單獨抽出,由於要遞歸調用 if (c is SkinDataGridView ) { SkinDataGridView dgv = c as SkinDataGridView; List<int> columnsWidth = new List<int>(); for (int col = 0; col < dgv.Columns.Count; col++) { columnsWidth.Add(dgv.Columns[col].Width); } dgvCols.Add(c.Name, columnsWidth); } if (c is Label) { Label label = c as Label; float size = label.Font.Size; LabelFonts.Add(label.Name, size); } if (c is RadioButton ) { RadioButton rdb = c as RadioButton; float size = rdb.Font.Size; RadioButtonFonts.Add(rdb.Name, size); } } }
在Form_Load中調用便可。這樣就完美解決了自適應問題。遞歸