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;
}
}
}
}
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#中如何调用窗体,不使用new最好了
请问C#如何在一个类或一个窗体中使用用另一个窗体的控件?
c#如何编子窗体
C#如何隐藏窗体?.Net 1.1
C#中 如何判断窗体是否关闭
如何在C#窗体中插入分隔线?
高手请进!c# 多窗体控件如何互相调用
C#中,如何设置使窗体大小不再改变?
C#如何在if语句判断中关闭窗体(急)
C#中在两个窗体之间如何传递数值
在C#里面如何删除MDI窗体的恢复按钮?
C# 窗体设计问题
c# 窗体控件问题
C#窗体切换
怎样在C#窗体上设置让它自动显示时间..(要会运行的)
c# 窗体数据的传递
C# Windows程序窗体大小
在C#中 如何让MDI的子窗体不重复
如何利用c#中的linklabel在windows窗体下链接文件夹或网页?
c#如何实现一个窗体或者面板从屏幕一侧,平滑移入,而且不闪烁
如何在C#控制台中使用dataGrid
C#中如何使用相对路径
delphi如何自动点击窗体中的任意一个坐标点?
怎么在C#中改变窗体标题栏