利用DockPanel與C#製作表單浮動和停靠(vs2010) 點擊功能窗 然後滑鼠拖動form2的效果圖如下:
1。下載的DockPanel。 在SF上能下到最新的版本的DLL和示範。 解壓檔案得到如下圖檔案:
2、構建主表單(父表單):frmMain的。 (1)建立工程:FloatingForm
(2)將DockPanel.config和WeifenLuo.WinFormsUI.Docking.dll複製到當前項目的 FloatingForm\FloatingForm\bin\Debug檔案下。
(3)首先添加引用WeifenLuo.WinFormsUI.Docking。
然後點擊工具箱右鍵添加DockPanel控制項到工具箱中。
(4)添加主表單frmMain中,並設定主表單的IsMdiContainer =true;
(5)在主表單中添加的DockPanel控制項:DockPanel1,並設定DockPanel中的documentstyle: dockPanel.DocumentStyle = DocumentStyle.DockingMdi;
frmMain的介面如下:(如果添加dockpanel控制項到frmMain出現錯誤則轉到注意事項查看)
後台代碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
using System.IO;
namespace FloatingForm
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
private string m_DockPath = string.Empty;
private void Form1_Load(object sender, EventArgs e)
{
this.DockPanel1.DocumentStyle = DocumentStyle.DockingMdi;
this.m_DockPath=Path.Combine(Path.GetDirectoryName(Application.ExecutablePath),"DockPanel.config");
this.InitDockPanel();
this.StatusBar.Items.Add("就緒"); //這是狀態列的,可要可不要,不影響。
}
#region 按照設定檔初始化Dockpanel
private void InitDockPanel()
{
try
{
//根據設定檔動態載入浮動表單
this.DockPanel1.LoadFromXml(this.m_DockPath, delegate(stringpersistString)
{
//功能表單
if (persistString ==typeof(frmFunction).ToString())
{
returnfrmFunction.GetInstance();
}
//主架構之外的表單不顯示
return null;
});
}
catch (Exception)
{
// 設定檔不存在或設定檔有問題時按系統預設規則載入子表單
frmFunction.GetInstance().Show(this.DockPanel1);
}
}
#endregion
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
//為了下次開啟程式時,浮動表單的顯示位置和關閉時一致,
DockPanel1.SaveAsXml(this.m_DockPath);
}
catch (Exception ex)
{
MessageBox.Show("儲存Dockpanel設定檔失敗," + ex.Message);
return;
}
}
private void dockPanel1ToolStripMenuItem_Click(object sender, EventArgse)
{
frmFunction frmFun = frmFunction.GetInstance();
frmFun.Show(this.DockPanel1, AppConfig.ms_FrmFunction);
this.StatusBar.Items[0].Text = frmFun.Text;
}
}
}
3. 構建需要浮動顯示的表單:FrmFunction。 (1)在當前工程中添加表單:FrmFunction;(注意:浮動表單和標籤表單需要繼承自DockContent);
(2)為了保證在關閉某一浮動表單之後,再開啟時能夠在原位置顯示,要對浮動表單處理,處理表單的 DockstateChanged事件,標籤表單dock位置改變,記錄到公用類;
frmFunction介面如下:(所要浮動的表單)
後台代碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
usingSystem.Windows.Forms;
usingWeifenLuo.WinFormsUI.Docking;
namespace FloatingForm
{
public partial class frmFunction : DockContent
{
private static frmFunctionInstance;
public frmFunction()
{
InitializeComponent();
}
public static frmFunction GetInstance()
{
if (Instance == null)
{
Instance = new frmFunction();
}
return Instance;
}
//為了保證在關閉某一浮動表單之後,再開啟時能夠在原位置顯示,要對浮動表單處理,處理表單的DockstateChanged事件,標籤表單dock位置改變,記錄到公用類
private void FrmFunction_DockStateChanged(object sender, EventArgs e)
{
//關閉時(dockstate為unknown) 不把dockstate儲存
if (Instance != null)
{
if (this.DockState ==DockState.Unknown || this.DockState == DockState.Hidden)
{
return;
}
AppConfig.ms_FrmFunction =this.DockState;
}
}
private void FrmFunction_FormClosing(object sender, FormClosingEventArgse)
{
Instance = null; // 否則下次開啟時報錯,提示“無法訪問已釋放對象”
}
}
} 4. 在當前工程中添加類AppConfig(公用類)。 代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WeifenLuo.WinFormsUI.Docking;
namespace FloatingForm
{
class AppConfig
{
public static DockState ms_FrmFunction =DockState.DockLeft; // 功能表單,左端停靠
}
}
5.成功運行,實現準系統(停靠在中間的效果圖)
注意事項
問題(1)描述:
vs2010添加WeifenLuo.WinFormsUI.Docking.DockPanel.dll檔案後,從工具列中添加DockPanel控制項時報錯,提示【類型 Universe 無法解析程式集: System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a。】
解決方案:
開啟【項目】的FloatingForm屬性,選擇【應用程式】,,修改【目標Framework(所有配置)】選項,在下拉框選項中選擇【.net Framework 4】即可。
以上我個人看別人部落格之後,在自己動手操作後的個人總結,主要寫了一些主要步驟和注意事項而已,如有紕漏,歡迎指教。謝謝。 (分享快樂)