zoukankan      html  css  js  c++  java
  • DevExpress 使用 XtraTabbedMdiManager 控件以 Tab样式加载 Mdi窗体并合并 RibbonControl 解决方案

    最近刚接触到 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 的 过滤功能.

    [注意: Mdi子窗体的RibbonControl中的控件合并到主窗体上的时候,是根据Text属性值来合并的,如果对应的 Text值和主窗体上的 RibbonControl中的 Page或是 Group 的Text一样的话就会被合并到同个Page或是 Group 中

    另外,子窗体中的RibbonControl中的按钮之类的是根据Caption来进行合并的可以通过: mergeType来控制在合并到主窗体时是 :

      Add添加(默认) ,

         Replace:替换(子窗体按钮设置就可以)

         MergeItems (还搞不清楚) 

         Remove:移除(需要主窗体的 MergeType 和 子窗体的MergeType 都设置为:Remove 时才可以)

    ]

  • 相关阅读:
    02 _ 该如何选择消息队列
    封装、抽象、继承、多态分别可以解决哪些编程问题?
    04 _ 理论一:当谈论面向对象的时候,我们到底在谈论什么?
    03 _ 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
    接口使用
    结构体和方法
    通道的高级玩法
    通道的基本操作
    极客时间 mp3提取
    iOS多线程中的单例
  • 原文地址:https://www.cnblogs.com/wuyifu/p/3382148.html
Copyright © 2011-2022 走看看