Devexpress动态添加的DockPanel在运行时,关闭DockPanel后,发现不能再打开相同功能的Panel了,因为我的程序有限制,某个功能Panel若己打开,就不再打开,而是激活该Panel, 由此可见,我运行时半闭DockPanel, 虽然在界面上关闭了,但内存的资源没有释放,所以再次打开该功能的Panel就被拒绝了
为此,程序需要注册Panel的关闭事件,把该Panel占用的资源释放掉
1. 释放资源的程序
// 给panel注册关闭事件
newPanel.ClosedPanel += (sender, e) =>
{
e.Panel.Dispose();
};
2. 以下是动态添加Panel的方法
/// <summary>
/// Panel若加载了窗体,再加载用户控件,只是加载的窗体有效,所以后面的两个只能选其一
/// 最后参数限制是否可以打开多个同样内容的窗体
/// </summary>
/// <param name="panelName"></param>
/// <param name="panelDock"></param>
/// <param name="panelForm"></param>
/// <param name="panelUserControll"></param>
private void showPanel(string panelName, DevExpress.XtraBars.Docking.DockingStyle panelDock, Form panelForm = null, UserControl panelUserControll = null,bool allowDuplicates = false)
{
// 若不允许重复打开多个同一功能的Panel, 检查是否己打开,若打开,则激活它,否则执行后续命令打开它
if (allowDuplicates == false)
{
foreach(DockPanel hasPanel in dockManager1.Panels)
{
if(hasPanel.Name == panelName)
{
dockManager1.ActivePanel = hasPanel;
return;
}
}
}
DockPanel samePanel = null;
DockPanel newPanel = null;
foreach (DockPanel hasPanel in dockManager1.Panels)
{
if (hasPanel.Dock == panelDock)
{
samePanel = hasPanel;
break;
}
}
if (samePanel == null)
{
// 增加Panel
newPanel = dockManager1.AddPanel(panelDock);
}
else
{
// 以Tab的方式增加Panel
newPanel = new DockPanel();
ControlContainer panelContain = new ControlContainer();
newPanel.Controls.Add(panelContain);
newPanel.Register(dockManager1);
newPanel.DockAsTab(samePanel);
}
newPanel.Name = panelName;
newPanel.TabText = panelName;
newPanel.Text = panelName;
newPanel.AutoScroll = true;
// panel加载窗体
if (panelForm != null)
{
// Form frmFileTransfer = panelForm;
panelForm.TopLevel = false;
newPanel.Controls.Add(panelForm);
panelForm.Dock = DockStyle.Fill;
panelForm.AutoScroll = true;
panelForm.FormBorderStyle = FormBorderStyle.None;
panelForm.Show();
}
// panel加载用户控件
if (panelUserControll != null)
{
newPanel.Controls.Add(panelUserControll);
panelUserControll.Dock = DockStyle.Fill;
panelUserControll.AutoScroll = true;
panelUserControll.BorderStyle = BorderStyle.None;
panelUserControll.Show();
}
// 给panel注册关闭事件
newPanel.ClosedPanel += (sender, e) =>
{
e.Panel.Dispose();
};
}
从代码中可以看出,同一内容的窗体若不允许多次打开,当该窗体的Panel关闭完后就打不开了,所以判断是Panel关闭后没有释放资源,所以才要给Panel注册关事件来释放资源