2009-08-17 135 views
0

我正在跟蹤我們工作室編寫的一個小型.NET應用程序中的一個錯誤。該對話框基本上是一個狀態報告對話框,它根據當前正在記錄的操作數嘗試動態地將1個(或更多)進度條添加到現有對話框。窗口最小化時,如何動態地將控件添加到窗體窗體splitter控件中?

我們有一個對話框,它有一個包含分離器容器的主對話框。分離器的下半部分綁定到一個顯示狀態噴出的豐富的edito控件。分離器區域的頂部是我們想要動態添加1個(或更多)進度條的位置。

在運行過程中,創建新的進度條,然後通過調整拆分容器面板1的大小來考慮新控件,然後將新控件添加到拆分容器中(將顯示代碼下面)。這段代碼很有效,窗口沒有被最小化。當窗口最小化時,運行時拋出一個異常,指出拆分的容器大小不能調整。具體而言,這裏是錯誤消息:

An exception of type 'System.InvalidOperationException' has occurred. 
Message: SplitterDistance must be between Panel1MinSize and Width - Panel2MinSize. 

的問題(我認爲)是因爲被最小化窗口時,窗口的高度是太小,以允許調整拆分容器的大小。我懷疑.NET正在查看Windows最小化的大小,而不是正常的狀態大小。

下面是代碼(請注意,拋出異常的行):

// if we don't have any operations yet, add a small top margin 
if (splMain.SplitterDistance == 0) { 
    splMain.SplitterDistance = 3;  // THE EXCEPTION IS THROWN HERE!!!! 
} 

ProgressDisplay display = new ProgressDisplay(); 
display.OperationFinished += OperationFinished; 
display.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; 
display.LabelText = label; 
display.Location = new Point(6, splMain.SplitterDistance); 
display.Size  = new Size(splMain.Panel1.Width-12, display.Height); 
display.Start(steps); 
m_Operations.Push(display); 

// add the display to the top panel 
splMain.IsSplitterFixed = false; 
splMain.SplitterDistance += display.Height + 3; 
splMain.IsSplitterFixed = true; 
splMain.Panel1.Controls.Add(display); 
m_splitterAdjusted = true; 

根據調試器,panel1MinSize是0,panel2MinSize是2,和寬度,和父窗口的大小是( 160,25)。因爲分離器是水平分離器,所以我懷疑異常中的「寬度」實際上是高度,即25,使得例外是SplitterDistance(3),必須在0和0之間 - 因此是例外。

現在,我只是不添加進度條,如果窗口最小化,但這當然有缺點,當窗口恢復時不顯示進度條。我想另一種解決方案是在還原事件中添加進度條(如果尚未添加進度條)。

我很好奇是否有更好的(或不同的)解決方案可用。謝謝!

回答

0

我打算建議'不要添加'的方法,但我看到你已經在做它。

將作業掛起直到恢復事件,然後將其添加並保存在那裏。當最小化窗口沒有大小,所以你不能將控件添加到窗體。