目前这个项目中使用到了SandDock控件,效果跟VS的浮动面板一样,可以停靠,但下面的两个面板是各占据一个空间来上下"瓜分"左边的位置
但实际上,这并不是我想要的效果,我想要的是如下所示的效果
即以Tab页的形式显示,在网上找了好久(苦苦找寻控件API未果),终于叫我找到了解决方案
先参考官网
http://www.divelements.co.uk/net/controls/sanddock/documentation/layoutsystems.aspx
其中提到一个至关重要的方法
"SandDockManager's GetLayout method" ,即sandDockManager.GetLoyout(),相对应的是SetLayout().注意这两个都是实例方法,而非静态.
通过调用这个方法,可以得到SandDock控件布局的XML描述
<Container Size="254, 495"> <SplitLayoutSystem SplitMode="Horizontal"> <ControlLayoutSystem Collapsed="False" Controls="2"> <Controls> <Control Guid="cb07b654-2f5d-4001-b45e-31605760b352" /> <Control Guid="5e2a8ad8-2e66-48da-912d-1e4ecf0f3106" /> </Controls> </ControlLayoutSystem> <SplitLayoutSystem SplitMode="Vertical"> <ControlLayoutSystem Collapsed="False" Controls="2"> <Controls> <Control Guid="3b9be0fe-6bb7-4341-bf8a-14ef3af1a9b6" /> <Control Guid="10704056-5361-428a-af0a-e774ec004250" /> </Controls> </ControlLayoutSystem> <ControlLayoutSystem Collapsed="False" Controls="1"> <Controls> <Control Guid="a464b2d9-4ebe-432e-a9b9-96ec0a76abe6" /> </Controls> </ControlLayoutSystem> </SplitLayoutSystem> </SplitLayoutSystem> </Container>ControlLayoutSystem 在界面上实际代表了一个活动面板容器, SplitLayoutSystem 标签把ControlLayoutSystem 包含在内,它可以定义包含在它内部的面板是横向排列,还是纵向排列, ControlLayoutSystem内部的Controls标签可以包含多个Control, 每个Control都是一个DockableWindow(活动面板),清楚了这些之后就好办了.
思路是这样,让ControlLayoutSystem标签只能有一个,即只能有一个面板容器,把所有的容器内包含的Control(即活动面板)都加到同一个容器之下,再删除其它所有的容器!
如此一来,所有的面板就都在一个容器中并以Tab分页的形式呈现了,实现代码如下
private void ShowWindow(DockableWindow window, DockableWindowSmartPartInfo smartPartInfo)
{
if (smartPartInfo.OpenFloating == true)
{
window.OpenFloating();
}
else
{
window.OpenDocked(smartPartInfo.SandDockLocation, smartPartInfo.SandOpenMethod);
}
SetWindowProperties(window, smartPartInfo);
window.BringToFront();
#region 解析控件的布局XML,并修改,目的是让所有Pad以Tab分页形式呈现
var xDoc = XDocument.Parse(sandDockManager.GetLayout());
xDoc.Element("Layout").Element("Container").Element("SplitLayoutSystem").Attribute("SplitMode").Value = "1";
var controlLayoutSystem =
xDoc.Element("Layout").Element("Container").Element("SplitLayoutSystem").Elements("ControlLayoutSystem");
if (controlLayoutSystem.ToList().Count > 1)
{
var windowGuid = window.Guid.ToString();
controlLayoutSystem.First().Attribute("SelectedControl").Value = windowGuid;
var findControl = controlLayoutSystem.First().Element("Controls").Elements("Control").FirstOrDefault(item =>
item.Attribute("Guid").Value == windowGuid);
if (findControl == null)
{
controlLayoutSystem.First()
.Element("Controls")
.Add(new XElement("Control", new XAttribute("Guid", windowGuid)));
}
foreach (XElement element in from element in controlLayoutSystem
let index = controlLayoutSystem.ToList().IndexOf(element)
where index > 0
select element)
{
element.Remove();
}
}
sandDockManager.SetLayout(xDoc.ToString());
#endregion
}