最近刚接触到 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 时才可以)

DevExpress 使用 XtraTabbedMdiManager 控件以 Tab样式加载 Mdi窗体并合并 RibbonControl 解决方案的更多相关文章

  1. 使用DevExpress.XtraTabbedMdi.XtraTabbedMdiManager控件来加载MDI窗体

    使用DevExpress.XtraTabbedMdi.XtraTabbedMdiManager控件来加载MDI窗体     [csharp] view plaincopyprint? <SPAN ...

  2. Winform开发框架之客户关系管理系统(CRM)的开发总结系列4-Tab控件页面的动态加载

    在前面介绍的几篇关于CRM系统的开发随笔中,里面都整合了多个页面的功能,包括多文档界面,以及客户相关信息的页面展示,这个模块就是利用DevExpress控件的XtraTabPage控件的动态加载实现的 ...

  3. 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图

    [源码下载] 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Co ...

  4. 控件WebView网页的加载

    Android:控件WebView网页的加载 WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用. webview有两个方法:setWebChromeClient 和 setWe ...

  5. 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

    [源码下载] 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互 作者: ...

  6. Swift - 网页控件(UIWebView)加载本地数据,文件

    使用UIWebView加载本地数据或资源有如下三种方式: 1,使用loadHTMLString方法加载HTML内容 2,使用loadRequest方法加载本地资源(也可用于加载服务器资源) 3,先将内 ...

  7. android 自定义控件之NetWorkImageView 处理listview等控件中的图片加载乱序问题

    0.调用: BaseAdapter中设置方法 holder.iv.loadImage(url); adapter_xxx.xml 中 控件需要用 xxx.NetWorkImageView 1 NetW ...

  8. easyui中 combogrid控件的loadData方法加载本地数据

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. ActiveX 控件和 Web 浏览器加载项

    百度ActiveX的概念. 如何从零开始写一个 Chrome 扩展 360极速浏览器应用开发平台.

随机推荐

  1. 制作东皇3.2的安装U盘-黑苹果之路

    每次使用硬盘映像安装需要先装windows,制作东皇3.2安装分区,再装bootthink,再通过bootthink加载东皇3.2的分区进行安装,非常繁琐.尝试制作U盘来直接安装东皇3.2.过程如下: ...

  2. The Ninth Hunan Collegiate Programming Contest (2013) Problem H

    Problem H High bridge, low bridge Q: There are one high bridge and one low bridge across the river. ...

  3. HDU1116图论

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1116 #include<stdio.h> #include<algorithm&g ...

  4. Appium小试

    最近有空玩了一下Appium,记录一下 1.下载Appium for windows,现在是0.12.3版本 https://bitbucket.org/appium/appium.app/downl ...

  5. 这些优化 Drupal 网站速度的超简单办法,你忽略了多少?

    “怎么样能让我的 Drupal 网站更快一些?”是我们最常遇到的一个问题.站点速度确实非常重要,因为它会影响你的 SEO排名效果.访客是否停留以及你自己管理网站所需要的时间. 今天我们就来看看那些通过 ...

  6. centos 7 安装音乐播放器(亲测可用)

    方法来源网上,非原创. 1. Install the nux repo  $> su - $> yum update # optional but recommanded $> rp ...

  7. Java Annotation 机制源码分析与使用

    1 Annotation 1.1 Annotation 概念及作用      1.  概念 An annotation is a form of metadata, that can be added ...

  8. badge ionic tab

    我需要在tab上动态显示 badge badge="badges.carts" badge-style="badge-assertive" 将这段代码 放在了 ...

  9. a different object with the same identifier value was already associat

    问题:这个著名的托管态update更新异常 org.hibernate.NonUniqueObjectException: a different object with the same ident ...

  10. leetcode 88

    88. Merge Sorted Array Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as on ...