分享

DevExpress 使用 XtraTabbedMdiManager 控件以 Tab样式加载 Mdi窗体并合并 RibbonControl 解决方案

 北方的白桦林 2017-06-24

最近刚接触到 DevExpress 13.1 这个皮肤组件, 觉得相当好用 于是开始准备搭建 个小应用的主体框架.

找了好久的就是没找到对应的文章来讲解这一块.. 翻了他们主网站上人家问的,以及API 才摸索... 不懂英文好吃力呀~~~

首先选到的就是,依旧用 Mdi子窗体模式加载子模块

第一步: 创建一个主 RibbonForm 为: ParentForm

  1.1 设置 RibbonControl 属性 MdiMergeStyle 为: Always 

第二步: 在左边拖入一个NavBarControl 设置Dock : Left

第三步: 拖入: XtraTabbedMdiManager

3.1 设置 XtraTabbedMdiManager 的 MdiParent 为: 当前窗体:ParentForm

第四步: 新建子 RibbonForm 为: ChildForm

第五步: 在ChildForm中拖入: XtraScrollableControl 并设置 Dock:Fill 然后你可以把你的组件都拖入这个控件,这样就会在 ChildForm 被 加载的话会有 滚动条

第六步: 在 ChildForm 的 RibbonControl 中添加对就应的 RibbonPage 和 按钮

好了,至此,基本控件我们都已经添加好了.,接下来我们来添加事件

第七步: 打开子窗体事件

在ParentForm的  navbarControl 中添加 Item 并添加事件

// 给 NavBarControl 添加 LinkClicked 事件
private void navBarControl2_LinkClicked(object sender, NavBarLinkEventArgs e) { AddPageMdi(e.Link.Item); }      // 打开子窗体方法
private void AddPageMdi(NavBarItem navItem) {
ChildForm childForm = new ChildForm(); childForm.MdiParent = this;    // 子窗体的 Text 就是 Tab页中的标题 ,我这里是直接取 navItem中的标题作为 tab页的标题
childForm.Text
= navItem.Caption + tabCount++; // 显示
childForm.Show(); // 设置当前 tab页的 图标,我这里也默认取navBar中的Item中的图标 xtraTabbedMdiManager1.Pages[subform].Image
= navItem.SmallImage; }

第八步: 添加双击页签时,关闭页签事件,记住 是添加在: XtraTabbedMdiManager 的 MouseDown 事件中:

private DateTime m_LastClick = System.DateTime.Now;
        private XtraMdiTabPage m_lastPage = null;
        private void xtraTabbedMdiManager1_MouseDown(object sender, MouseEventArgs e)
        {
            XtraMdiTabPage curPage = (sender as XtraTabbedMdiManager).SelectedPage;

            if (e.Button == MouseButtons.Left)
            {

                DateTime dt = DateTime.Now;
                TimeSpan span = dt.Subtract(m_LastClick);
                if (span.TotalMilliseconds < 300)  //如果两次点击的时间间隔小于300毫秒,则认为是双击
                {


                    if (this.MdiChildren.Length > 1)
                    {

                        // 限制只有在同一个页签上双击才能关闭.(规避两个页签切换时点太快导致意外关闭页签)
                        if (curPage.Equals(m_lastPage))
                        {
                            //if (this.ActiveMdiChild != m_MapForm)
                            //{
                            this.ActiveMdiChild.Close();
                            //}

                        }
                    }
                    m_LastClick = dt.AddMinutes(-1);
                }
                else
                {
                    m_LastClick = dt;
                    m_lastPage = curPage;
                }
            }
        }

第九步: 添加合并Mdi子窗体的 状态栏 ,记得是在ParentForm的 RibbonControl控的 Merge事件和 UnMerge 事件中添加 这样就能在切换子窗体页签的时候同时将子窗体的状态栏也合并到主窗体的状态栏上,并且在切换另一个的时候同时卸载当前子窗体的合并状态栏,

private void ribbon_Merge(object sender, DevExpress.XtraBars.Ribbon.RibbonMergeEventArgs e)
        {
            RibbonControl parentRRibbon = sender as RibbonControl;
            RibbonControl childRibbon = e.MergedChild;
            parentRRibbon.StatusBar.MergeStatusBar(childRibbon.StatusBar);
        }

        private void ribbon_UnMerge(object sender, RibbonMergeEventArgs e)
        {
            RibbonControl parentRRibbon = sender as RibbonControl;
            parentRRibbon.StatusBar.UnMergeStatusBar();

        }

OK 基本至此,小应用框架就能搭建出来了,后期还需要再添加控制,已经加载的子窗体不能重复添加的功能.

以及 NavBarControl 的 过滤功能.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多