2014-12-31 62 views
2

我目前正在佈局玩弄並做了一個試驗項目中,我構建,其顯示含有一個TableLayoutPanel三行面板的形式:爲什麼設置MinimumSize會破壞表格佈局?

  • 一個文本框
  • 按鈕
  • 一應該佔據剩餘垂直空間的佔位符標籤。

此測試正常工作,但如果我將文本框的最小大小設置爲例如(400,200),我不能再看到按鈕。表格佈局中的第一行不應該包含AutoSize的內容?請注意, 明確將RowStyles設置爲SizeType.AutoSize不會更改任何內容。


無最小尺寸集:

Screenshot where the text box and button are visible

最小尺寸組:

Screenshot where the button is hidden behind the text box


using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace LayoutTest 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      var sampleForm = new Form(); 
      var samplePanel = new Panel() { Dock = DockStyle.Fill }; 
      var sampleTextBox = new TextBox() { Dock = DockStyle.Fill }; 
      // This line breaks the layout 
      //sampleTextBox.MinimumSize = new Size(400, 200); 
      var sampleButton = new Button() { Dock = DockStyle.Fill }; 

      var panelLayout = new TableLayoutPanel() { Dock = DockStyle.Fill }; 
      panelLayout.Controls.Add(sampleTextBox, 0, 0); 
      panelLayout.Controls.Add(sampleButton, 0, 1); 
      // Add a placeholder label to take up the remaining space 
      panelLayout.Controls.Add(new Label() { Text = String.Empty, Dock = DockStyle.Fill }); 

      samplePanel.Controls.Add(panelLayout); 

      sampleForm.Controls.Add(samplePanel); 

      Application.Run(sampleForm); 
     } 
    } 
} 
+0

您希望TableLayoutPanel能夠在表格佈局中完成它的工作,佈局控制,而不必告訴它*如何完成工作。添加行。這由於TextBox.GetPreferredSize()返回值而出錯。使用設計師。 –

回答

4

按鈕是undern選擇文本框。您需要將multiline屬性設置爲true

E.g.

sampleTextBox.Multiline = true; 

此行爲的來源於TableLayoutPanelTextBox。如果TableLayoutPanel明確測試Control是否爲TextBox並且Multiline屬性設置爲true,然後再決定遵守約束條件,那將會很奇怪。然而,在我的測試中,似乎Multiline屬性必須在將其添加到TableLayoutPanel之前設置,並且如果Multiline未設置,則該控件返回到文本框下方,並且即使Multiline再次設置爲true也不會返回。

E.g.

 sampleButton.Click += delegate { 
      Size s1 = sampleTextBox.MinimumSize; // always returns the set MinSize 
      sampleTextBox.Multiline = !sampleTextBox.Multiline; 
      Size s2 = sampleTextBox.MinimumSize; // always returns the set MinSize 
      panelLayout.Invalidate(true); 
      panelLayout.PerformLayout(); 
     }; 
+0

看起來像我選擇了錯誤的控件進行測試;-)謝謝你解決這個問題。 –

+0

「TableLayoutPanel」和「FlowLayoutPanel」的行爲並不像預期的那樣(例如,你的「TextBox」示例)。此外,MSDN文檔沒有提供關於每個「佈局」在執行佈局時遵守的所有屬性的足夠信息。 – Loathing