2012-10-18 25 views
1

我有一個MDI應用程序。我有一個標記爲「Window」的ToolStripMenuItem,它被設置爲我的主要MenuStripMdiWindowListItem。窗口菜單有幾個項目,例如「級聯」和「排列圖標」。MdiWindowListItem在沒有子窗口打開時的額外分隔符

當我運行我的應用程序時,窗口菜單結束整齊地與我的「排列圖標」項目。正如所料,當我打開一個或多個MDI子窗體時,它們會自動附加在ToolStripSeparator之後。當我關閉所有的子窗體時,它們會按照預期從「窗口」菜單中消失,但仍保留ToolStripSeparator。我希望菜單能夠回到原來的狀態,即沒有分隔符。

就目前而言,分隔符會自動添加,但不會自動刪除。當然,我可以嘗試以編程方式消除額外的分隔符,但我沒有看到其他人抱怨這一點,這讓我懷疑它可能發生,因爲我做錯了什麼。請指教。

回答

1

嘗試在「排列圖標」菜單項後添加自己的ToolStripSeparator菜單項,並將Visible屬性設置爲false。

當打開MDI子窗體,使其可見:

Form f = new Form(); 
    f.Text = "Test Form"; 
    f.MdiParent = this; 
    f.FormClosed += ChildClosed; 
    f.Show(); 
    ts.Visible = true; 

然後在ChildClosed方法:

void ChildClosed(object sender, FormClosedEventArgs e) { 
    this.BeginInvoke((Action)delegate 
         { ts.Visible = (this.MdiChildren.Count() > 0); } 
       ); 
} 
+0

完成工作,但標準行爲仍然困擾着我。該菜單自動添加子表單,並再次刪除它們。它會自動添加分隔符,但不會將其刪除。邏輯在哪裏? – Stephan

+0

順便說一句,爲什麼在這裏需要使用BeginInvoke?我試着直接設置'ts.Visible'的值,並且它不能正常工作。是否等待表單更新其子表? – Stephan

+1

@Stephan在最後一個子表單關閉之後,* MdiChildren.Count將不爲零。在封閉事件中,子表單還沒有完全消失。 'BeginInvoke'是告訴程序在當前過程之後運行一段代碼的簡單方法。 – LarsTech

0

ts.Visible = (this.MdiChildren.Count() > 1)
在孩子的關閉事件 就足夠了。不需要BeginInvoke

+0

謝謝你的回答。正如我在@ LarsTech的回答中所指出的那樣,我曾嘗試在沒有'BeginInvoke'的情況下設置'Visible',但是我發現當孩子關閉時,這沒有隱藏分隔符。 – Stephan