WinFormsUI(转xiaisidinen)
DockPanel Suite使用非常簡單,它主要含有兩個類DockContent和DockPanel。
DockContent是可停靠式選項卡的基類,所有可停靠的選項卡控件都必須基礎自它。它是Form的子類,也就是說,可停靠的選項卡是一個個單獨的窗體。
DockPanel繼承自Panel,是可停靠選項卡的容器。
下面將以一個簡單的多文檔編輯器為例,介紹如何使用DockPanel Suite庫。
新建一個WinForm的項目,加入WinFormsUI的引用?
創建主窗口,將主窗口的IsMdiContainer屬性設置為true。在主窗口中加置一個DockPanel控件,并設置其Dock屬性為DockStyle.Fill。?
創建文檔編輯器選項卡窗口TextForm(本例中的文檔編輯器窗口中只有一個簡單的textbox),將TextForm的基類有Form修改為DockContent。?
在主窗口中添加File菜單,并添加new命令。?
??????? int count = 1;
??????? private void newToolStripMenuItem_Click(object sender, EventArgs e)
??????? {
??????????? TextForm t = new TextForm();
??????????? t.Text = "文檔" + count++;
??????????? t.Show(dockPanel1);
??????? }
運行效果如下,是不是比較酷?
可能細心的讀者已經看出來以上程序的一些不足的地方:
選項卡的標題都是"TextForm",而不是我在代碼中預期的"文檔1"、"文檔2"的形式。?
選項卡過于靈活(文檔選項卡可以被拖動到任意地方),這往往是我們需要限制的,比如說工具選項卡是不希望能拖到屏幕中央的,而文檔選項卡是不希望拖到屏幕的四周而能自動隱藏的。?
這些問題是很容易解決的,當選項卡繼承自DockContent后,在屬性設置中就會多出Docking選項,如下圖所示。通過這些屬性的設置,可以靈活的定制我們的選項卡。
對于問題1,需要把TabText屬性設置為null,這樣選項的標題就會隨著Text屬性而改變了。對于問題2,只要設置其合適的DockAreas即可。
另外值得一提的是,可停靠式選項卡和主窗口是一種父窗口和mdi窗口間的關系,因此mdi窗口的那些特性(如獲取活動選項卡、選項卡菜單和主窗口菜單合并等)也可以用在這里,這里就不多介紹了。
最后介紹一下選項卡的位置的保存和恢復。
選項卡的位置的保存和恢復可以通過DockPanel的SaveAsXml函數和LoadFromXml函數實現,這兩個函數使用非常簡單,參看一下控件中的例子很容易使用。如果選項卡需要自定義序列化數據,只需要覆蓋GetPersistString函數即可。
試用了一段時間這個庫后,總體感覺是美觀、大方、強大、簡單易用。這些都是非常難得的。就是在選項卡較多的時候,改變窗口大小不是很流暢。當然,這個和.net的winform控件本身不如c++效率高有關(不過在我用過的.net停靠控件中效率也算一流的)。希望今后能看到更多或開發像這樣的.net精品項目。
一些小改進:
1、當雙擊Tab時,原先是直接把當前Tab所表示的這個窗體,從主窗體的框架上分離現來,成為一個浮動的窗體。這不是我想要的,我把它改成了雙擊關閉。
在DockPaneStripBase的WndProc方法里,對于左鍵雙擊消息重新作了處理(下面注釋掉的一行是原先的寫法,它下面那行是改的):
??????? [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
??????? protected override void WndProc(ref Message m)
??????? {
??????????? if (m.Msg == (int)Win32.Msgs.WM_LBUTTONDBLCLK)
??????????? {
??????????????? base.WndProc(ref m);
??????????????? int index = HitTest();
??????????????? if (DockPane.DockPanel.AllowEndUserDocking && index != -1)
??????????????? {
??????????????????? IDockContent content = Tabs[index].Content;
??????????????????? if (content.DockHandler.CheckDockState(!content.DockHandler.IsFloat) != DockState.Unknown)
??????????????????????? //content.DockHandler.IsFloat = !content.DockHandler.IsFloat;?
??????????????????????? content.DockHandler.Close();
??????????????? }
??????????????? return;
??????????? }
??????????? base.WndProc(ref m);
??????????? return;
??????? }
2、很多窗體都在Tab中有個右鍵菜單,右擊的里面有關閉,所以最好繼承一下DockContent,讓其它窗體只要繼承這個就有了這個右鍵菜單
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WeifenLuo.WinFormsUI.Docking
{
??? public class DockContentEx : WeifenLuo.WinFormsUI.Docking.DockContent
??? {
??????? public DockContentEx()
??????? {
??????????? ContextMenuStrip cms = new System.Windows.Forms.ContextMenuStrip();
??????????? ToolStripMenuItem tsmiClose = new System.Windows.Forms.ToolStripMenuItem();
??????????? //?
??????????? // cms
??????????? //?
??????????? tsmiClose.Name = "cms";
??????????? tsmiClose.Size = new System.Drawing.Size(98, 22);
??????????? tsmiClose.Text = "關閉";
??????????? tsmiClose.Click += new System.EventHandler(this.tsmiClose_Click);
??????????? //?
??????????? // tsmiClose
??????????? //?
??????????? cms.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
??????????? tsmiClose});
??????????? cms.Name = "tsmiClose";
??????????? cms.Size = new System.Drawing.Size(99, 26);
??????????? this.TabPageContextMenuStrip = cms;
??????? }
??????? private void tsmiClose_Click(object sender, EventArgs e)
??????? {
??????????? this.Close();
??????? }
??? }
}
轉載于:https://www.cnblogs.com/beblue/archive/2009/08/12/1544783.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的WinFormsUI(转xiaisidinen)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET防止页面刷新的方法
- 下一篇: JS弹出窗口窗口的位置和大小