C#窗体自动停靠-如何使用weifenluo.dll(by?Kiseigo)

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;

}

}

}

}

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;

}

}

}

}


相关内容

  • C#暑假作业答案
  • C#暑假作业 一.单项选择题 1.属于C#语言的关键字( ). A. abstract B. camel C. Salary D. Employ 答案:A 2.C#语言中,值类型包括:基本值类型.结构类型和( ). A.小数类型 B.整数类型 C.类类型 D.枚举类型 答案:D 3. 假定一个10行 ...

  • 计算机科学与技术英文文献
  • <专业英语>期末考试课程论文 微软ASP.NET 设计应用 班 级: 13级信息管理与信息系统1班 学 号: [1**********]14 姓 名: 朱敦达 分 数: 2015年12月25日 微软ASP.NET 设计应用 CGI 具有扩充性能和克服的问题的能力,是微软公司开发的一种新的 ...

  • 各种编程语言的特点
  • 各种编程语言的特点.txt Pascal语言: Pascal是一种计算机通用的高级程序设计语言,由瑞士Niklaus Wirth教授六十年代末设计并创立的. Pascal的主要特点有:严格的结构化形式.丰富完备的数据类型.运行效率高.查错能力强等特点. 由于上述特点,Pascal可以方便用于描述各种 ...

  • 太原理工大学毕业设计
  • 继续教育学院综合作业报告 二〇一〇年五月十五日 摘 要 本文首先介绍了数据库管理系统(DBMS )的基本概念及关系模型等.然后对问题的来源进行深入分析,指出图书借阅者.图书馆工作人员和图书馆管理人员是问题主要来源, 并指出本数据管理系统的实用性功能就是管理好图书馆信息,提高工作效率,避免数据处理手工 ...

  • 测量程序设计实习报告
  • 测量程序设计实习报告 姓名: 班级: 学号: 教师评语: 日期:二零一四年十二月 实验名称:使用C#开发环境建立测量程序框架 一.实验的目的与任务: (1) 学会用C#窗体程序开发环境建立应用程序框架方法 (2) 学会使用常见的Windows 控件 (3) 根据自身需要设计一个测量程序界面 二.实验 ...

  • [C#程序设计基础入门教程]_习题答案
  • <C#程序设计基础入门教程>习题答案 第1章 C#开发入门 一.填空题 1. .dll. .exe 2. CLR 3. 编译.运行 4. 互操作性 5. Console.WriteLine() 二.选择题 1. C 2.B 3.C 4.A 5.D 三.问答题 1. 它是一个全新的.集成的 ...

  • 关于appdomain, assembly, 进程,线程的概念体会
  • AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序. AppDomain是CLR实现代码隔离的基本机制. 每一个AppDomain可以单独运行.停止:每个AppDomain有自己默认的异常处理: 一个AppDomain的运行失败不会影响到其他的AppDomain. ...

  • 基于.Net C#的声音波形显示
  • 摘要:Wav文件包含文件头和数据块,记录了声音的波形..Net C#开发环境提供了文件流和流的读写器等操作类,可以方便地实现对wav文件的解析从而得到声音的波形数据,再利用Graphics类的各种图形绘制方法将波形数据绘制成曲线. 中国论文网 http://www.xzbu.com/8/view-3 ...

  • 测量程序设计报告
  • 环境与测绘工程学院 课程论文 学年学期: 2016-2017(一) 课程名称: 测量程序设计 论文题目: 附合导线平差求解 姓 名: 胡慧茹 学 号: 2014100455 任课教师: 白洪伟 目录 一 实训目的.....................................3 二 实训任 ...