C# Winform 自適應

參考: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中調用便可。這樣就完美解決了自適應問題。遞歸

相關文章
相關標籤/搜索