WinFormsUI(转xiaisidinen)
DockPanel Suite使用非常簡(jiǎn)單,它主要含有兩個(gè)類DockContent和DockPanel。
DockContent是可停靠式選項(xiàng)卡的基類,所有可停靠的選項(xiàng)卡控件都必須基礎(chǔ)自它。它是Form的子類,也就是說,可停靠的選項(xiàng)卡是一個(gè)個(gè)單獨(dú)的窗體。
DockPanel繼承自Panel,是可停靠選項(xiàng)卡的容器。
下面將以一個(gè)簡(jiǎn)單的多文檔編輯器為例,介紹如何使用DockPanel Suite庫(kù)。
新建一個(gè)WinForm的項(xiàng)目,加入WinFormsUI的引用?
創(chuàng)建主窗口,將主窗口的IsMdiContainer屬性設(shè)置為true。在主窗口中加置一個(gè)DockPanel控件,并設(shè)置其Dock屬性為DockStyle.Fill。?
創(chuàng)建文檔編輯器選項(xiàng)卡窗口TextForm(本例中的文檔編輯器窗口中只有一個(gè)簡(jiǎn)單的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);
??????? }
運(yùn)行效果如下,是不是比較酷?
可能細(xì)心的讀者已經(jīng)看出來以上程序的一些不足的地方:
選項(xiàng)卡的標(biāo)題都是"TextForm",而不是我在代碼中預(yù)期的"文檔1"、"文檔2"的形式。?
選項(xiàng)卡過于靈活(文檔選項(xiàng)卡可以被拖動(dòng)到任意地方),這往往是我們需要限制的,比如說工具選項(xiàng)卡是不希望能拖到屏幕中央的,而文檔選項(xiàng)卡是不希望拖到屏幕的四周而能自動(dòng)隱藏的。?
這些問題是很容易解決的,當(dāng)選項(xiàng)卡繼承自DockContent后,在屬性設(shè)置中就會(huì)多出Docking選項(xiàng),如下圖所示。通過這些屬性的設(shè)置,可以靈活的定制我們的選項(xiàng)卡。
對(duì)于問題1,需要把TabText屬性設(shè)置為null,這樣選項(xiàng)的標(biāo)題就會(huì)隨著Text屬性而改變了。對(duì)于問題2,只要設(shè)置其合適的DockAreas即可。
另外值得一提的是,可停靠式選項(xiàng)卡和主窗口是一種父窗口和mdi窗口間的關(guān)系,因此mdi窗口的那些特性(如獲取活動(dòng)選項(xiàng)卡、選項(xiàng)卡菜單和主窗口菜單合并等)也可以用在這里,這里就不多介紹了。
最后介紹一下選項(xiàng)卡的位置的保存和恢復(fù)。
選項(xiàng)卡的位置的保存和恢復(fù)可以通過DockPanel的SaveAsXml函數(shù)和LoadFromXml函數(shù)實(shí)現(xiàn),這兩個(gè)函數(shù)使用非常簡(jiǎn)單,參看一下控件中的例子很容易使用。如果選項(xiàng)卡需要自定義序列化數(shù)據(jù),只需要覆蓋GetPersistString函數(shù)即可。
試用了一段時(shí)間這個(gè)庫(kù)后,總體感覺是美觀、大方、強(qiáng)大、簡(jiǎn)單易用。這些都是非常難得的。就是在選項(xiàng)卡較多的時(shí)候,改變窗口大小不是很流暢。當(dāng)然,這個(gè)和.net的winform控件本身不如c++效率高有關(guān)(不過在我用過的.net停靠控件中效率也算一流的)。希望今后能看到更多或開發(fā)像這樣的.net精品項(xiàng)目。
一些小改進(jìn):
1、當(dāng)雙擊Tab時(shí),原先是直接把當(dāng)前Tab所表示的這個(gè)窗體,從主窗體的框架上分離現(xiàn)來,成為一個(gè)浮動(dòng)的窗體。這不是我想要的,我把它改成了雙擊關(guān)閉。
在DockPaneStripBase的WndProc方法里,對(duì)于左鍵雙擊消息重新作了處理(下面注釋掉的一行是原先的寫法,它下面那行是改的):
??????? [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中有個(gè)右鍵菜單,右擊的里面有關(guān)閉,所以最好繼承一下DockContent,讓其它窗體只要繼承這個(gè)就有了這個(gè)右鍵菜單
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 = "關(guān)閉";
??????????? 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();
??????? }
??? }
}
轉(zhuǎn)載于:https://www.cnblogs.com/beblue/archive/2009/08/12/1544783.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的WinFormsUI(转xiaisidinen)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET防止页面刷新的方法
- 下一篇: JS弹出窗口窗口的位置和大小