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 時才可以)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM