本文介紹WinForms程序開發中佈局界面的設計,主要介紹如何在我的共享軟件中使用佈局控件"WeifenLuo.WinFormsUI.Docking"。
PS:給大家推薦一個C#開發可以用到的界面組件——DevExpress WinForms,它能完美構建流暢、美觀且易於使用的應用程序,無論是Office風格的界面,還是分析處理大批量的業務數據,它都能輕鬆勝任!
DevExpress技術交流羣9:909157416 歡迎一起進羣討論
佈局控件"WeifenLuo.WinFormsUI.Docking"是一個非常棒的開源控件,用過的人都深有體會,該控件很強大、美觀,而且控件使用也是比較簡單的,先看看控件使用的程序界面展示效果。
配電網絡可視化管理系統的界面截圖:
深田之星送水管理系統網絡版的界面截圖:
我在幾個共享軟件都使用了該佈局控件,先以“深田之星送水管理系統網絡版”這款軟件爲例,介紹如何完成該界面的設計及顯示的。
1、首先,我們添加一個主界面窗體,命名爲MainForm,該窗體IsMdiContainer設置爲True,也就是設置爲多文檔窗體格式。拖拉布局控件"WeifenLuo.WinFormsUI.Docking.DockPanel"到主窗體MainForm中,並設置下面幾個屬性:
Dock爲Fill、DocumentStyle爲DockingMdi、RightToLeftLayout爲True。
這幾個屬性的意思應該不難,Dock就是 覆蓋整個MDI窗體的區域,DocumentStyle爲多文檔類型、RightToLeftLayout是指新打開的窗口都停靠在右邊區域。
我們看看設計界面視圖如下所示。
2、主界面其實基本上就可以了,另外我們看到“送水管理系統網絡版”的界面中有一個左邊的工具欄,它其實也是在一個停靠的窗體中的,我們增加一個窗體用來承載相關的工具快捷鍵按鈕展示。命名爲MainToolWindow的窗體,繼承自WeifenLuo.WinFormsUI.Docking.DockContent。
其中的“HideOnClose”屬性很重要,該屬性一般設置爲True,就是指你關閉窗口時,窗體只是隱藏而不是真的關閉。
左邊的窗口MainToolWindow實現停靠的代碼是在MainForm的構造函數或者Load函數中加載即可。
mainToolWin.Show(this.dockPanel, DockState.DockLeft);
3、對於工具窗口我們已經完成了,但是主業務窗口還沒有做,也就是下面的部分內容。
爲了方便,我們定義一個基類窗體,命名爲BaseForm,繼承自DockContent,如下所示
public class BaseForm : DockContent
然後每個業務窗口繼承BaseForm即可。
4、剩下的內容就是如何在主窗體MainForm中展示相關的業務窗口了,展示的代碼如下所示:
public partial class MainForm : Form { #region 屬性字段 private MainToolWindow mainToolWin = new MainToolWindow(); private FrmProduct frmProduct = new FrmProduct(); private FrmCustomer frmCustomer = new FrmCustomer(); private FrmOrder frmOrder = new FrmOrder(); private FrmStock frmStock = new FrmStock(); private FrmComingCall frmComingCall = new FrmComingCall(); private FrmDeliving frmDeliving = new FrmDeliving(); private FrmTicketHistory frmHistory = new FrmTicketHistory(); #endregion public MainForm() { InitializeComponent(); SplashScreen.Splasher.Status = "正在展示相關的內容"; System.Threading.Thread.Sleep(100); mainToolWin.Show(this.dockPanel, DockState.DockLeft); frmComingCall.Show(this.dockPanel); frmDeliving.Show(this.dockPanel); frmHistory.Show(this.dockPanel); frmStock.Show(this.dockPanel); frmProduct.Show(this.dockPanel); frmCustomer.Show(this.dockPanel); frmOrder.Show(this.dockPanel); SplashScreen.Splasher.Status = "初始化完畢"; System.Threading.Thread.Sleep(50); SplashScreen.Splasher.Close(); }
5、下面貼出基本窗口的基本操作事件函數:
private void menu_Window_CloseAll_Click(object sender, EventArgs e) { CloseAllDocuments(); } private void menu_Window_CloseOther_Click(object sender, EventArgs e) { if (dockPanel.DocumentStyle == DocumentStyle.SystemMdi) { Form activeMdi = ActiveMdiChild; foreach (Form form in MdiChildren) { if (form != activeMdi) { form.Close(); } } } else { foreach (IDockContent document in dockPanel.DocumentsToArray()) { if (!document.DockHandler.IsActivated) { document.DockHandler.Close(); } } } } private DockContent FindDocument(string text) { if (dockPanel.DocumentStyle == DocumentStyle.SystemMdi) { foreach (Form form in MdiChildren) { if (form.Text == text) { return form as DockContent; } } return null; } else { foreach (DockContent content in dockPanel.Documents) { if (content.DockHandler.TabText == text) { return content; } } return null; } } public DockContent ShowContent(string caption, Type formType) { DockContent frm = FindDocument(caption); if (frm == null) { frm = ChildWinManagement.LoadMdiForm(Portal.gc.MainDialog, formType) as DockContent; } frm.Show(this.dockPanel); frm.BringToFront(); return frm; } public void CloseAllDocuments() { if (dockPanel.DocumentStyle == DocumentStyle.SystemMdi) { foreach (Form form in MdiChildren) { form.Close(); } } else { IDockContent[] documents = dockPanel.DocumentsToArray(); foreach (IDockContent content in documents) { content.DockHandler.Close(); } } }
最後呈上該控件文件,大家可以下來玩玩。
https://files.cnblogs.com/wuhuacong/WeifenLuo.WinFormsUI.Docking.rar
本文轉載自:博客園 - 伍華聰