ubuntu kylin 双显卡:C#窗体自动停靠—如何使用weifenluo.dll(by?Kiseigo)

来源:百度文库 编辑:中财网 时间:2024/05/01 00:46:24
C#窗体自动停靠的实现——如何使用weifenluo.dll
By Kiseigo 2010.06
效果如下:


1. 新建成功和修改主窗体的名称,如图1

2. 新建一个文件夹,专门放使用到的dll,下载后复制到这里来,如图2:

然后添加引用,如图3

如图4:

如图5:

3.把控件DockPanel从工具箱拖到主窗体上。
主窗体FrmMain的界面上,ctrl + w,然后松开鼠标,X,就出现了工具箱,其中有DockPanel。如图6:

双击DockPanel,或者拖动它到FrmMain中。
主窗体的几个属性设置一下:
IsMdiContainer = True; 这个必须设置
WindowState = Maximized
dockPanel1的Dock = Fill
如图7:

4.把2个子窗体FrmSubOne和FrmSubTwo的继承对象都修改一下:
public partial class FrmSubTwo : Form
变成:
public partial class FrmSubTwo : WeifenLuo.WinFormsUI.Docking.DockContent
public partial class FrmSubOne : Form
变成:
public partial class FrmSubOne : WeifenLuo.WinFormsUI.Docking.DockContent
可以在子窗体的FrmSubOne.Designer.cs中的InitializeComponent()设置不让子窗体往某个地方停靠:
// 可以停靠任何5个位置
//this.DockAreas = ((WeifenLuo.WinFormsUI.Docking.DockAreas)(((((WeifenLuo.WinFormsUI.Docking.DockAreas.Float
//    | WeifenLuo.WinFormsUI.Docking.DockAreas.DockLeft)
//    | WeifenLuo.WinFormsUI.Docking.DockAreas.DockRight)
//    | WeifenLuo.WinFormsUI.Docking.DockAreas.DockTop)
//    | WeifenLuo.WinFormsUI.Docking.DockAreas.DockBottom)
//    | WeifenLuo.WinFormsUI.Docking.DockAreas.Document));
// 不可在中间停靠
this.DockAreas = ((WeifenLuo.WinFormsUI.Docking.DockAreas)(((((WeifenLuo.WinFormsUI.Docking.DockAreas.Float
| WeifenLuo.WinFormsUI.Docking.DockAreas.DockLeft)
| WeifenLuo.WinFormsUI.Docking.DockAreas.DockRight)
| WeifenLuo.WinFormsUI.Docking.DockAreas.DockTop)
| WeifenLuo.WinFormsUI.Docking.DockAreas.DockBottom)));
另外一个子窗体也可以按照需要设置。
5. 主窗体界面如图8:

主窗体代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace AppWeifenluo
{
public partial class FrmMain : Form
{
///
/// 子窗体1
///

private FrmSubOne m_frmSubOne = new FrmSubOne();
///
/// 子窗体2
///

private FrmSubTwo m_frmSubTwo = new FrmSubTwo();
public FrmMain()
{
InitializeComponent();
}
private void FrmMain_Load(object sender, EventArgs e)
{
m_frmSubOne.Owner = this;
m_frmSubOne.Show(this.dockPanel1);
m_frmSubOne.DockTo(this.dockPanel1, DockStyle.Left);
m_frmSubTwo.Owner = this;
m_frmSubTwo.Show(this.dockPanel1);
m_frmSubTwo.DockTo(this.dockPanel1, DockStyle.Right);
}
}
}
6. 效果:
确定落点前,如图9:

确定落点后,如图10:

7. 多个窗体的位置还可以保存以便下次读取,方法是:
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
string configFile = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath),
"DockPanel.config");
dockPanel1.SaveAsXml(configFile);
}
需要注意的是,必须先保存,下次才能读取。而且,config文件很容易损坏,最好备份一个文件,一旦出了问题就恢复config文件就好了。
8. 读取多个子窗体的位置
读取config文件配置界面的方法,刚才的m_frmSubOne.Show(this.dockPanel1);之类就不需要了。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using WeifenLuo.WinFormsUI.Docking;
namespace AppWeifenluo
{
public partial class FrmMain : Form
{
///
/// 子窗体1
///

private FrmSubOne m_frmSubOne = new FrmSubOne();
///
/// 子窗体2
///

private FrmSubTwo m_frmSubTwo = new FrmSubTwo();
///
/// 反序列化dock的内容
///

private DeserializeDockContent ddc;
public FrmMain()
{
InitializeComponent();
}
// 读取配置文件。务必确保文件存在
private void FrmMain_Load(object sender, EventArgs e)
{
ddc = new DeserializeDockContent(GetContentFromPersistString); // 放在后面的话会出错。
string configFile = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "DockPanel.config");
if (File.Exists(configFile))
{
dockPanel1.LoadFromXml(configFile, ddc);
}
}
// 保存位置到config文件中
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
string configFile = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath),
"DockPanel.config");
dockPanel1.SaveAsXml(configFile);
}
private IDockContent GetContentFromPersistString(string persistString)
{
if (persistString == typeof(FrmSubOne).ToString())
return m_frmSubOne;
if (persistString == typeof(FrmSubTwo).ToString())
return m_frmSubTwo;
else
{
return null;
}
}
}
}