DotNetBar是一個不錯的DotNET控件套裝,原來是一個DLL文件,能夠做出很漂亮的界面效果,記得在8.0以前的版本,好像實現多文檔界面稍顯得麻煩一些,我的Winform框架、WCF框架雖然也提供了這樣多文檔的界面,不過都是曲線救國的方式實現。隨着DotNetBar控件的逐步完善,版本一路飆升,文件也開始學DevExpress那樣,使用多個文件進行拆分了。目前11.0版本以上,都有一個SuperTabControl的控件,實現多文檔的界面已經很方便了。本文介紹利用SuperTabControl控件實現一個多文檔界面的效果,供大家參考學習。
1、多文檔界面的設計
下面是框架的一個基於DotNetBar控件的界面設計效果,按照Ribbon樣式的方式進行組織,並把多文檔界面放在中間,這樣界面效果更加美觀合理。
另外爲了使得在Tab頁面上可以關閉窗口,可以增加一個右鍵菜單,如下所示。
設置控件的相關屬性,使得他的關閉按鈕一直存在,並關聯它的右鍵菜單即可,如下所示。
這個SuperTabControl,支持好幾種Tab樣式的,有些看起來非常不錯,在其中選擇自己喜歡的樣式即可。
2、多文檔界面的代碼實現
在主界面中的Form_Load事件中,我們清空並初始化默認的Tab頁面即可,如下所示。
private void MainForm_Load(object sender, EventArgs e) { Init(); //清空默認的Tab NavTabControl.Tabs.Clear(); tool_ItemDetail_Click(null, null); }
private void tool_ItemDetail_Click(object sender, EventArgs e) { SetMdiForm("備件信息", typeof(FrmItemDetail)); }
從上面的代碼,我們看到核心的界面排版就是SetMdiForm函數了,下面我們來看看這個函數的具體實現。這個函數目的就是創建或者顯示一個多文檔界面頁面。
/// <summary> /// 創建或者顯示一個多文檔界面頁面 /// </summary> /// <param name="caption">窗體標題</param> /// <param name="formType">窗體類型</param> public void SetMdiForm(string caption, Type formType) { bool IsOpened = false; //遍歷現有的Tab頁面,如果存在,那麼設置爲選中即可 foreach (SuperTabItem tabitem in NavTabControl.Tabs) { if (tabitem.Name == caption) { NavTabControl.SelectedTab = tabitem; IsOpened = true; break; } } //如果在現有Tab頁面中沒有找到,那麼就要初始化了Tab頁面了 if (!IsOpened) { //爲了方便管理,調用LoadMdiForm函數來創建一個新的窗體,並作爲MDI的子窗體 //然後分配給SuperTab控件,創建一個SuperTabItem並顯示 DevComponents.DotNetBar.Office2007Form form = ChildWinManagement.LoadMdiForm(Portal.gc.MainDialog, formType) as DevComponents.DotNetBar.Office2007Form; SuperTabItem tabItem = NavTabControl.CreateTab(caption); tabItem.Name = caption; tabItem.Text = caption; form.FormBorderStyle = FormBorderStyle.None; form.TopLevel = false; form.Visible = true; form.Dock = DockStyle.Fill; //tabItem.Icon = form.Icon; tabItem.AttachedControl.Controls.Add(form); NavTabControl.SelectedTab = tabItem; } }
上面提到了右鍵菜單的操作,關閉其他或者關閉全部Tab頁面的功能,這個實現如下所示。
private void ctx_Window_CloseAll_Click(object sender, EventArgs e) { CloseAllDocuments(); } private void ctx_Window_CloseOther_Click(object sender, EventArgs e) { CloseOthers(); }
public void CloseAllDocuments() { for (int i = NavTabControl.Tabs.Count - 1; i >= 0; i--) { SuperTabItem tabitem = NavTabControl.Tabs[i] as SuperTabItem; if (tabitem != null) { tabitem.Close(); } } } public void CloseOthers() { if (ActiveMdiChild != null) { Type formType = ActiveMdiChild.GetType(); for (int i = NavTabControl.Tabs.Count - 1; i >= 0; i--) { SuperTabItem tabitem = NavTabControl.Tabs[i] as SuperTabItem; if (tabitem != null && formType != tabitem.AttachedControl.Controls[0].GetType()) { tabitem.Close(); } } } }
最終界面效果如下所示。
另一個權限管理系統界面的多文檔界面調整如下所示。
這樣引入了Supertab控件,整體的多文檔Tab界面實現起來就更加方便和美觀了。