Dot-Net

WinForms 錨定控制項無法正確最大化

  • February 3, 2017

我對 WinForms (VB.NET) 有疑問。

主視窗是一個 MDI 容器。使用者打開一個新的子視窗:

非最大化的孩子 1

然後最大化它,所以視窗正確地填滿了客戶區。我的控制項已正確錨定(使用 IDE 屬性 Anchor)到視窗側面,因此放大視窗始終可以很好地填充客戶區域:

最大化的孩子 1

在這種狀態下(客戶端視窗最大化),使用者打開一個不同的或新的子視窗,但是新的視窗控制項沒有被拉伸,也就是說他們不“理解”他們應該拉伸!

非拉伸兒童 2

這特別煩人,因為如果使用者嘗試恢復視窗,則控制項會被拉伸,因此它們會消失(請參閱不再有列表視圖)!

恢復的孩子 2

這是一個錯誤嗎?我該如何解決這個問題?

編輯:根據 Hans Passant 的評論,我創建了一個新的簡單項目,它可以正常工作。所以我調查了我的真實項目和样本有什麼不同。不同之處在於,在我的項目中,我動態地創建表單。

我在工具欄上動態創建了許多按鈕。當使用者點擊一個按鈕時,這是被執行的程式碼:

Private Sub buttonClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
       Cursor.Current = Cursors.WaitCursor

       Dim b As Button = CType(sender, Button)

       Dim assem As Assembly = Assembly.GetExecutingAssembly()
       Dim formType As Type = assem.GetType(CStr(b.Tag))

       Dim exFormAsObj As Object = Nothing
       Try
           exFormAsObj = Activator.CreateInstance(formType)
       Catch ex As Exception
           Cursor.Current = Cursors.Default
           MessageBox.Show("clicca meglio:" + ex.ToString)
           Exit Sub
       End Try

       Dim f As Form = CType(exFormAsObj, Form)
       f.MdiParent = Me
       f.Show()

       Cursor.Current = Cursors.Default
   End Sub

也就是說,表單名稱在按鈕標籤中。我創建了一個新的表單實例,Activator.CreateInstance(formType)然後我顯示它:f.Show().

我很確定問題出在這個動態的子表單創建中,但我不知道在哪裡。

編輯2:找到!在我的表單中,我正在做的常見 Load 事件

myform.SuspendLayout()
' various instructions
myform.ResumeLayout(False)

而不是 False 我應該寫成 true:myform.ResumeLayout(True)

這麼簡單,對不起。

我找到了解決方案,(感謝 Cody Gray 建議在此處發布我自己的答案)。

在我的表單中,我正在執行常見的 Load 事件:

myform.SuspendLayout()
'' various instructions
myform.ResumeLayout(False)

而不是False我應該寫truemyform.ResumeLayout(True)

簡單,但很棘手。謝謝大家。

我認為您可能想要實現的目標是使用

this.LayoutMdi(MdiLayout.TileHorizontal);

或其親屬之一。

請記住,通常不鼓勵 MDI 佈局。

引用自:https://stackoverflow.com/questions/4924334