2013-08-06 199 views
6

一般問題SplitContainer的面板調整大小問題

的應用程序是C#的WinForms .NET 4.0。

我有一個SplitContainer佔據了大部分的形式,它被設置爲所有方向錨,所以它隨着形式重新調整大小。左面板(Panel1)有一個簡單的菜單,這裏沒有問題。右側面板(Panel2)更加複雜,並且包含許多嵌套的選項卡控件(包含許多控件) - 它非常複雜,但不會改變。

問題是重新調整表格的效果並不好。事實上,如果通過緩慢拖動邊緣來調整大小,那麼它可以正常工作,但可以快速拖動或使用「恢復」按鈕(表單右上角),然後就會出現問題。


我的控制層次

以下是我的控制層級,它絕對是一個削減版的一個簡單的例子,但確實凸顯了嵌套的標籤控制的,可與複製幫助:

  • 形式
    • 拆分集裝箱(主播:上,左,下,右)
      • SC Panel1的(最小寬度:300)
        • TreeViewControl(忘記它叫什麼)
      • SC是Panel2
        • 面板(錨:頂部,左邊,底部,右側)
          • 選項卡控件(錨點:頂部,左側,底部,右側)
            • 選項卡控件包含大量溢出屏幕並需要導航按鈕才能顯示的頁面p右下角(主播:上,左,下,右)

調試詳細

一些調試後,它看起來實際上是Panel2(拆分容器的孩子)沒有正確調整大小,而實際的SplitContainer本身調整正常。

這裏是調試值,顯示此...

全寬形式,調整大小前:

splitContainerMain.Width: 1479 
splitContainerMain.Panel2.Width: 1206 
panelCenter.Width: 1203 
tabControlMain.Width: 1215 

所有預期,splitContainerMain.Panel2.WidthsplitContainerMain.Width小。

調整大小後在那裏出現問題:

splitContainerMain.Width: 815 
splitContainerMain.Panel2.Width: 1206 
panelCenter.Width: 1203 
tabControlMain.Width: 1215 

可以看出,在splitContainerMain.Width已調整爲所需,但splitContainerMain.Panel2.Width,隨後其子都沒有。

注意:請記住,寬度更新正確,如果我手動調整的形式慢慢地 - 這是不是我沒有正確設置任何錨的問題。


我的努力到目前爲止

我想知道如果這個問題是related to this problem here,但我不準備建立一個新的「MySplitContainer」,試圖解決這個問題。

我試圖做的是使用各種Form resize事件,並嘗試手動設置寬度,但無濟於事。我想我想嘗試的是從某種事件中設置Panel2.Width值。


我所尋找的

  • 反正是有強制splitContainerMain.Panel2.Width正確調整splitContainerMain大小變化時?
  • 或者,我該如何計算Panel2.Width應該是什麼?我怎樣才能從Form.Resize事件中設置這個值? (或另一個事件?)
+0

我試圖把一個形式進行測試,但我還沒有看到你描述的不良行爲。如果你可以提供更多的佈局細節,這將有所幫助。但除此之外,我沒有太多運氣來重現你的結果。 – DonBoitnott

+0

@DonBoitnott:我已經添加了一些關於我的佈局的細節,我知道這不是很容易複製,但也許它會做一些事情。我會看看我是否可以在一個新的Winforms應用程序中複製 – musefan

+0

什麼是'panelCenter'?而且你如何在代碼中調整大小... ...只需拖動窗體邊緣? – DonBoitnott

回答

0

從我看到你應該設置錨爲none爲控件創建包括splitcontainer pannels的問題。

此外,我會建議使用碼頭填充屬性以最好地使用splitcontainers。

如果需要進一步的幫助,請提供設計器文件,以便更好看。

-2

完全相同的問題,下面的代碼爲我工作:在面板中的 「tableBorder」

在tableBorder

Dock = DockStyle.Fill; 

在拆分集裝箱,(

  1. 環繞SplitContainer的無錨定)

    Dock = DockStyle.None; 
    
  2. 在tableBorder SizeChanged事件

    private void tableBorder_SizeChanged(object sender, EventArgs e) 
    { 
        new Thread(() => { resizeMe(); }).Start(); 
    } 
    
    private void resizeMe() 
    { 
        Thread.Sleep(100); 
    
        this.BeginInvoke((Action)(() => { 
    
         doIt(); 
    
        })); 
    } 
    
    private void doIt() 
    { 
        splitContainer.Height = tableBorder.Height; 
        splitContainer.Width = tableBorder.Width; 
    } 
    

有一個小的滯後,但工程