none
請教各位先進,如何在flowLayoutPanel讓數個button的寬度隨form縮放 RRS feed

  • 一般討論

  • 在flowLayoutPanel該如何讓數個button的寬度大小隨著Form一起縮放,並依Form的寬度讓每個button寬度一樣,但不得小於所設定的寬度。
    類似tableLayoutPanel可以讓控制項隨欄位寬度縮放,讓每個控制項都一樣大,又能有flowLayoutPanel的排列功能,因為想要讓Form上的按鈕在表單較小的時候可以排列成兩排,而第二排的控制項可以平均放大寬度,拉大Form的時候又可以縮成一排。


    • 已編輯 REX86 2015年6月21日 下午 08:27 說明
    • 已變更類型 Bill ChungMVP, Moderator 2015年7月7日 下午 04:46 發問者未繼續回覆, 已然石沉大海
    2015年6月21日 下午 08:23

所有回覆

  • 感謝大大的回覆,有去看了您所說的那篇討論,與我的期望值有點落差, 可能是描述的不夠清楚,FlowLayoutPanel在拉寬的時候,希望裡面的button也會隨著一起平均變寬。

    2015年6月23日 下午 04:43
  • Windows Forms 不像 WPF 有 WrapPanel 這種玩意.

    所以要寫程式硬做.

     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                ChangeButtonsWidth(flowLayoutPanel1);
                flowLayoutPanel1.SizeChanged +=flowLayoutPanel1_SizeChanged; 
                 
            }
    
            // 假設按鈕的最小寬度為 100 (不包含 Margin.Left 與 Margin.Right)
            private int minWidthOfButton = 100;
    
    
            private void flowLayoutPanel1_SizeChanged(object sender, EventArgs e)
            {
                var panel = (FlowLayoutPanel)sender;
                ChangeButtonsWidth(panel);
            }
    
            private void ChangeButtonsWidth(FlowLayoutPanel panel)
            {
                // 取得 Panel 目前的寬度
                int panelWidth = panel.Width;
                List<Button> buttons = new List<Button>();
                int sumOfButtonsMarginWidth = 0;
    
                // 將 Panel 內所有的 Button 加入 List<Button> 並且計算所有按鈕的左右邊界和
                foreach (var control in flowLayoutPanel1.Controls)
                {
                    if (control.GetType() == typeof(Button))
                    {
                        var button = (Button)control;
                        buttons.Add(button);
                        sumOfButtonsMarginWidth += button.Margin.Left + button.Margin.Right;
                    }
                }
    
    
                int newButtonWidth = minWidthOfButton;
    
                // 判斷 Panel 的寬度是否大於 ( 所有按鈕的最小寬度和 + 所有左右邊界和)
                if (panel.Width > (buttons.Count * minWidthOfButton + sumOfButtonsMarginWidth))
                {
                    // 如果 Panel 的寬度比較大, 則將 Panel 寬度減去所有左右邊界和後除以 Button 的數量即為新的寬度
                    newButtonWidth = (panel.Width - sumOfButtonsMarginWidth) / buttons.Count ;
                }
                foreach (var button in buttons)
                {
                    button.Width = newButtonWidth;
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                MessageBox.Show(((Button)sender).Width.ToString());
            }
       
        }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2015年6月24日 上午 11:31
    版主
  • Hi:

    請問這問題目前進度如何? 是否已解決或有進一步的問題呢 ? 別忘了回覆自己的問題,  Thanks.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2015年7月1日 下午 09:50
    版主
  • 這邊有篇用 TableLayoutPanel 自動排版的,

    Label1 / Button1 寬度不變

    TextBox1 自動縮放

    有點像 IE 的作法

    沒寫程式碼,只是設定,可以看看是不是比較簡便。

    https://tlcheng.wordpress.com/2015/03/07/vbnet-%e4%b8%80%e5%80%8b%e7%b0%a1%e5%96%ae%e7%9a%84-youtube-%e6%92%ad%e6%94%be%e5%99%a8/


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2015年7月4日 上午 07:46