最近刚接触到 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. java 抽象类和接口总结

    1.抽象类和抽象方法必须使用abstract 关键字来修饰 2.抽象类不能实例化 3.抽象方法是为实现的方法,它与空方法时两个完全不同的概念 4.abstract 不能喝private static ...

  2. Air Raid(最小路径覆盖)

    Description Consider a town where all the streets are one-way and each street leads from one interse ...

  3. 【最后一篇API译文】Android开发-API指南- Contacts Provider

    Contacts Provider 今年加入了某字幕组,加之杂事颇多,许久未添新文了,惭愧之极. 在听闻 Google 即将重返中国后,近日忽又发现官方网站正在放出 API 中文版,比如本文.当然不是 ...

  4. 根据文字返回Label高度

    NSString分类 @implementation NSString (stringSize) //计算文字显示的所需要的size -(CGSize)sizeWithFont:(UIFont *)f ...

  5. org.apache.ibatis.reflection.ReflectionException

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Reflecti ...

  6. hive安装(一)

    1.解压 [root@cluster3 hadoop]# tar -zxvf apache-hive--bin.tar.gz 2.修改环境变量 export HIVE_HOME=/usr/local/ ...

  7. 华为OJ平台——尼科彻斯定理

    题目描述: 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和. 例如: 1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19 输入 输入一个int整数 ...

  8. angular factory Services provider 自定义服务 工厂

    转载于 作者:海底苍鹰地址:http://blog.51yip.com/jsjquery/1602.html 1.在app.js 中声明了模块的依赖 var phonecatApp = angular ...

  9. js中object的申明方法

    //js中的对象申明使用new Object(); //object类型的数据类似于数组通过下表来访问其中的值 //example1 var person=new Object(); person.n ...

  10. landsat8简介

    简介 2013年2月11号,NASA 成功发射了 Landsat 8 卫星,为走过了四十年辉煌岁月的 Landsat 计划重新注入新鲜血液.LandSat- 8上携带有两个主要载荷:OLI和TIRS. ...