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.整数类 ...

    计算机科学与技术英文文献

    <专业英语>期末考试课程论文 微软ASP.NET 设计应用 班 级: 13级信息管理与信息系统1班 学 号: [1**********]14 姓 名: 朱敦达 分 数: 2015年12月25日 微软ASP.NET 设计应用 CG ...

    各种编程语言的特点

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

    测量程序设计实习报告

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

    太原理工大学毕业设计

    继续教育学院综合作业报告 二〇一〇年五月十五日 摘 要 本文首先介绍了数据库管理系统(DBMS )的基本概念及关系模型等.然后对问题的来源进行深入分析,指出图书借阅者.图书馆工作人员和图书馆管理人员是问题主要来源, 并指出本数据管理系统的实 ...

    关于appdomain, assembly, 进程,线程的概念体会

    AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序. AppDomain是CLR实现代码隔离的基本机制. 每一个AppDomain可以单独运行.停止:每个AppDomain有自己默认的异常处理: 一个Ap ...

    [C#程序设计基础入门教程]_习题答案

    <C#程序设计基础入门教程>习题答案 第1章 C#开发入门 一.填空题 1. .dll. .exe 2. CLR 3. 编译.运行 4. 互操作性 5. Console.WriteLine() 二.选择题 1. C 2.B 3. ...

    餐馆管理系统的设计与实现报告

    郑州轻工业学院 专科毕业设计(论文) 题 目 餐馆管理系统的设计与实现 学生姓名 专业班级 计算机应用技术 学 号 院 (系) 软件学院 指导教师(职称) 完成时间 郑州轻工业学院软件学院 毕业设计任务书 题目 餐馆管理系统的设计与实现 专 ...

    测量程序设计报告

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