使SandDock的多个浮动面板以Tab页形式显示

目前这个项目中使用到了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
        }



这是一个免费程序(目前还是测试版),作者不但提供控件, 而且还无偿提供控件的所有源代码,您可以在个人或者商业程序中免费使用DockPresident 地址: http://www.pigtwo.com/CtrlData/WebSite/luxiaoban.htm 如果您下载并且使用了DockPresident,请留下您的感受和意见,也算是对作者所做工作的肯定。 下面是她的readme文件中的内容: 作为Delphi的忠实用户,我想大家对Delphi中的停靠窗体应该比较熟悉吧,是不是也希望自己编的程序也具有这样的功能? 使她看起来更漂亮,更专业,更方便。本人做的一套停靠控件DockPresident正好能满足您的要求,DockPresident包含五个控件, 她们分别是TlbDockServer, TlbDockClient, TlbDelphiDockStyle, TlbVCDockStyle, TlbVIDDockStyle。 只要在主窗口上放上TDockServer控件,在一般窗口上放上TlbDockClient控件,这两个窗体就有了停靠功能。不用编写一行代码, 效果和Delphi的IDE一样,并且比她功能更强。并且两个都放了TlbDockClient控件的窗体还可以相互停靠, 分别停靠成平铺型和分型的窗体。用户还可以改变停靠的风格, TlbDockServer和TlbDockClient都有一个属性叫做DockStyle, 只要把TlbDelphiDockStyle, TlbVCDockStyle或者TlbVIDDockStyle控件赋值给DockStyle属性, 用户您就拥有了Delphi, Visual C++或者Visual InterDev的停靠风格。 这套控件还有很多属性供用户设置,来改变她们的停靠特性。 在当前文件夹中又有一些子文件夹,分别是: Source: 控件的源代码. SupportClass: 一个第三方控件wmEdit的DCU文件,用于Demo程序中. Help: 帮助文件,请读者务必仔细阅读,里面有控件的详细说明. Document: 文档资料,如果读者想对DockPresident有更深入的了解, 阅读里面的文章. Demo: 例子程序,用来演示DockPresident控件的使用方法和效果,里面有两个程序AdviceDemo和VCDemo. AdviceDemo程序演示了所有的DockPresident控件的用法, VCDemo主要用来演示TlbVCDockStyle的用法.由于wmEdit的原因,在VCDemo程序中有两个工程文件, 分别是VCDemoPro_D5和VCDemoPro_D6,如果用户使用的是Delphi5.0,请使用VCDemoPro_D5工程, 反之就使用VCDemoPro_D6. Bin 用来存储Source文件夹中对应文件的DCU,编译后会产生,用户可以把它删除掉. 控件安装: 如果用户使用的是Delphi5.0,请打开DockControl_D5.dpk文件安装,如果用户使用的是Delphi6.0, 请打开DockControl_D6.dpk文件安装.控件安装完成后,用户还需要配置一下Delphi, 好让Delphi能找到源文件的路经, 设置方法: 点击Tools菜单的Environment Options,弹出Environment Options对话框, 点击Library,然后点击Library path右边的按钮, 在弹出的Directories对话框中添加上控件源文件所在的文件夹,比如:D:DockFormControlSource. 如果用户没有配置Delphi,Demo文件夹中的程序也是可以使用的,因为作者已经帮用户设置好了, 但是如果用户要自己做一个全新的程序,请按照前面的方法配置您的Delphi.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值