WeifenLuo.WinFormsUI.DockContent這個(gè)控件不錯(cuò), 可以很方便地實(shí)現(xiàn)如vs 2005里那種窗口定位, 浮動(dòng), dock, tab化等界面效果.
下面是一個(gè)小例子:
××××××××××××××××××××××××××××××××××××××××××××
dockpanel中提供了幾個(gè)可用的類, 重要的有兩個(gè), 一是DockPanel, 一是DockContent,
DockPanel是從panel繼承出來(lái)的, 用于提供可浮動(dòng)的dock的子窗口進(jìn)行浮動(dòng)和dock的場(chǎng)所,
DockContent是從form類中繼承出來(lái)的, 用于提供可浮動(dòng)的窗口基類. 就是說(shuō): DockContent對(duì)象可以在DockPanel對(duì)象中任意貼邊, 浮動(dòng), TAB化等.
建立一個(gè)dockpanel風(fēng)格的程序的過(guò)程是:
1. 建立一個(gè)winform程序, 引用WinFormsUI.dll;
2. 程序主窗口比如說(shuō)是FrmMain; 把FrmMain.IsMdiContainer 設(shè)置為true;
3. 在FrmMain中放一個(gè)DockPanel, 比如說(shuō)名稱是Panel1, 把Panel1.Dock設(shè)為Fill, 或是者是你規(guī)劃的地方.
4. 新建你的子文檔窗口類, 就是新建一個(gè)windows FORM, 在窗口設(shè)計(jì)器里面隨便你添上什么愿意要的控件. 這將是你的程序里的子窗口, 我弄了兩個(gè):
一個(gè)叫FrmChild, 里面放了一個(gè)dock fill的editbox,
另一個(gè)叫FrmProperty, 放了一個(gè)dock fill的PropertyGrid, 名叫propertyGrid1,
并將 editbox,propertyGrid1都設(shè)置為公有成員。
5. 打開(kāi)FrmChild和FrmProperty的代碼, 把class的繼承類由Form改為DockContent;
如:
public class FrmChild : WeifenLuo.WinFormsUI.DockContent // 注意這里改了!
{
}
6. 為FrmMain加上兩個(gè)私有成員:
FrmChild fc;
FrmProperty fp;
這兩個(gè)成員用來(lái)保存待會(huì)兒新建的兩個(gè)窗口的指針.
7. 為FrmMain的Load寫些代碼, 如下:
fc = new FrmChild();
fp = new FrmProperty();
fc.Show(this.dockPanel1);
fp.Show(this.dockPanel1,WeifenLuo.WinFormsUI.DockState.DockLeft);
fp.propertyGrid1.SelectedObject = fc;
fp.propertyGrid1.PropertyValueChanged +=new PropertyValueChangedEventHandler(propertyGrid1_PropertyValueChanged);
fc.MouseDown +=new MouseEventHandler(fc_MouseDown);
fc.MouseUp +=new MouseEventHandler(fc_MouseUp);
就是建立兩個(gè)窗口, 這兩個(gè)窗口都是從DockContent中繼承的, 都有貼邊, tab化, 自動(dòng)hide的能力, 很有意思的.
注意DockContent有新的Show()方法, 可以指定要Show的DockPanel, 當(dāng)然要寫上你準(zhǔn)備的那個(gè)dockPanel1;
兩個(gè)都Show了, 然后為fp的propertyGrid1指定要顯示的對(duì)象, 就是fc;
之后再注冊(cè)事件處理程序, 這幾句是為了可以實(shí)現(xiàn)屬性變了窗口變, 窗口變了屬性變的效果, 可以動(dòng)態(tài)地看到這些對(duì)象的屬性對(duì)于其外觀和形為的影響, 對(duì)于只想建個(gè)多窗口程序的人來(lái)說(shuō), Show完了就可了.
8. 由于上面注冊(cè)的事件, 下面加幾個(gè)事件處理程序:
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
this.dockPanel1.Invalidate();
this.fc.Invalidate();
//this.fc.Refresh();
}
private void fc_MouseDown(object sender, MouseEventArgs e)
{
this.fp.propertyGrid1.Refresh();
}
private void fc_MouseUp(object sender, MouseEventArgs e)
{
this.fp.propertyGrid1.Refresh();