使用DotNetBar制作漂亮的WinFrom界面,自定义AgileEAS.NET SOA平台WinClient主界面
一、前言
AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的。
AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC、ORM、SOA、分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体、数据模型设计生成工具、代码生成工具,用于帮助中小软件开发商快速成长。
AgileEAS.NET平台充分把握目前软件行业快速发展的新趋势,基于敏捷并行开发、快速适应市场这样淳朴的软件工程实践,采用业界广泛使用的Microsoft .Net构件(组件)开发技术实践了这种开发思想,帮助软件企业实现“敏捷变化、快速适合”的目标,从而帮助软件企业在激烈的市场竞争中赢得先机并获得更高的回报。
二、关于WinClient的外挂资源体系介绍
最初版本的AgileEAS.NET SOA中间件平台的运行容器/外壳是没有界面替换体系,最初只是提供了替换关键部分的图片、文字的功能,随着AgileEAS.NET SOA中间件被众多的客户应用到各行各业之后,我们从客户的应用反馈之中进行了大量的重构,其中运行容器也越来越开放,从最初令开放替换部分图片到慢慢开放可以自由修改其他的导航栏、Banner、状态栏、菜单、登录界面、关于界面,发生了很大的变化,同步我们也提供了Desktop、MDI、Dockable等多种界面风格,可以说客户有更我的选择了。
随着更多软件企业或组织加入应用AgileEAS.NET SOA中间件行业,有许多的客户已经不能满足于在这几种风格之中进行选择,希望能给自己最大的自定义空间和范围,提供了更换主界面的需求,我们积极的响应这种需求,并且提出了相关的解决方案,并且在2012年AgileEAS.NET SOA 5.0版本的时间向大家提供。
主界面替换被某一些我们服务于的客户所使用,但是对于广大的关心AgileEAS.NET SOA中间件的朋友来说,并不能得到我们细致并且一对一的服务,因为我们还没有变此部分内容给大家做过介绍和在公开的案例之中提供,所以对于社区之中的很多朋友来说,还能灵活的应用本部分内容。
下图是一个典型的AgileEAS.NET SOA中间件平台WinClient容器的主界面:
其中包含以下组成部分:
主菜单:界面最上部的主菜单,系统、视图和帮助。
导航菜单:通过菜单之中的菜单项可以打开指点的功能模块。
导航栏:同系统导航菜单、以树形或者其他形式展示。
状态栏:显示系统的一些状态信息,如操作消息、当前登录信息等。
内容区:除以上项目外的界面空白区域为业务工作区,即模块插件的工作区域,新打开的模块在经区域显示和工作。
启始页:特指工作区之中第一个打开的模块,当系统登录完成之后会自动打开一个模块,此模块称为起始页模块。
三、IResource接口
AgileEAS.NET SOA 中间件平台为了应用对运行容器的各个部分进行自定义和扩展,提供了一个资源接口IResource:
1: using System;
2:
3: namespace EAS.Explorer
4: {
5: /// <summary>
6: /// 运行容器的外壳资源。
7: /// </summary>
8: public interface IResource
9: {
10: /// <summary>
11: /// 获取应用系统的图标,用于替换主界面的图标。
12: /// </summary>
13: System.Drawing.Icon GetMainIcon();
14:
15: /// <summary>
16: /// 获取默认的模块图标,用于简约、经典风格的Tab页图标显示,也用于Desktop模式的桌面图标显示。
17: /// </summary>
18: System.Drawing.Image GetModuleIcon();
19:
20: /// <summary>
21: /// 获取桌面背景图像,用于Desktop模式的桌面模块。
22: /// </summary>
23: System.Drawing.Image GetDesktopImage();
24:
25: /// <summary>
26: /// 获取应用系统的导航控件,用于替换平台的导航控件。
27: /// </summary>
28: /// <returns>WinForm/WPF用户控件。</returns>
29: object GetNavigationControl();
30:
31: /// <summary>
32: /// 获取应用系统的Banner控件,用于替换平台的Banner条。
33: /// </summary>
34: /// <returns>WinForm/WPF用户控件。</returns>
35: object GetBannerControl();
36:
37: /// <summary>
38: /// 获取应用系统的Bottom控件,用于替换平台的状态栏。
39: /// </summary>
40: /// <returns>WinForm/WPF用户控件。</returns>
41: object GetBottomControl();
42:
43: /// <summary>
44: /// 获取WinForm/WPF容器的关于对话框,用于替换平台的关于对话框。
45: /// </summary>
46: /// <returns>WinForm/WPF窗体。</returns>
47: object GetAboutForm();
48:
49: /// <summary>
50: /// 获取WinForm/WPF容器的主界面,用于替换平台的主界面。
51: /// </summary>
52: /// <returns>WinForm/WPF窗体。</returns>
53: object GetMainShell();
54:
55: /// <summary>
56: /// 获取WinForm/WPF/Silverlight容器的登录对话框,用于替换平台的登录对话框。
57: /// </summary>
58: /// <returns>WinForm/WPF/Silverlight窗体。</returns>
59: ILoginForm GetLoginForm();
60:
61: /// <summary>
62: /// 获取WinForm/WPF容器的起始页/初始模块,用于替换平台的起始页。
63: /// </summary>
64: /// <returns>WinForm/WPF用户控件。</returns>
65: object GetStartModule();
66:
67: /// <summary>
68: /// 获取系统的名称,显示在运行环境的导航栏。
69: /// </summary>
70: /// <returns>应用系统名称。</returns>
71: string GetApplicationName();
72:
73: /// <summary>
74: /// 获取系统的标题,显示在运行环境的主窗口之上。
75: /// </summary>
76: /// <returns>应用系统名称。</returns>
77: string GetApplicationTitle();
78:
79: /// <summary>
80: /// 是否显示主菜单。
81: /// </summary>
82: bool DisplayMainMenu
83: {
84: get;
85: }
86:
87: /// <summary>
88: /// 是否显示导航工具条。
89: /// </summary>
90: bool DisplayNavigationTool
91: {
92: get;
93: }
94: }
95: }
实现AgileEAS.NET SOA 平台的资源替换即是实现IResource接口的过程,在我们DrugShop、SmartERP案例之中都有对应的实现项目DrugShop.Res和SmartERP.Res。
当然,光实现IResource还不购,还需要修改系统的配置文件,以便让资源生效:
1: <;!--资源-->
2: <object name="EAS.Explorer.Resource" assembly="DrugShop.Res" type="DrugShop.Res.Resources" LifestyleType="Singleton"/>
需要注意的是在EAS.Explorer.dll程序集之中还定义了以下两个接口,INavigation接口:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Text.RegularExpressions;
6:
7: namespace EAS.Explorer
8: {
9: /// <;summary>
10: /// 导航控件接口。
11: /// <;/summary>
12: public interface INavigation
13: {
14: /// <;summary>
15: /// 初始化导航。
16: /// <;/summary>
17: /// <;param name="m_GroupList">导航清单。</param>
18: /// <;param name="m_ModuleList">模块清单。</param>
19: void Initialize(IList<;INavigateGroup> m_GroupList, IList<INavigateModule> m_ModuleList);
20: }
21: }
ILoginForm接口:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:
6: namespace EAS.Explorer
7: {
8: /// <;summary>
9: /// 定义登记对话框接口,用于实现自定义登录。
10: /// <;/summary>
11: public interface ILoginForm
12: {
13: /// <;summary>
14: /// 是否已经通过登录验证。
15: /// <;/summary>
16: bool Passed { get; }
17: }
18: }
自定义的导航控件必须实现INavigation接口,以便于平台实现导航的初始化,方法Initialize由平台调用,传入当前系统登录人员所具有权限的模块清单及相关的导航清单。
自定我的登录界面必须实现ILoginForm,以便于系统判定登录界面是否完成了登录验证。
四、IMainShell接口和自定义主界面
第三节在介绍IResource接口的时候我们会发现其他有一个GetMainShell()方法,其用于获取资源实现之中的主界面定义,系统主界面必须是一个Form并且要实现IMainShell接口:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:
6: namespace EAS.Explorer
7: {
8: /// <;summary>
9: /// 定义主界面接口,用于实现自定义主界面。
10: /// <;/summary>
11: public interface IMainShell
12: {
13: /// <;summary>
14: /// 初始化主界面,根据平台传入的模块清单和相关的导航分组初始化主界面。
15: /// <;/summary>
16: /// <;param name="m_GroupList">导航清单。</param>
17: /// <;param name="m_ModuleList">模块清单。</param>
18: void InitializeShell(IList<;INavigateGroup> m_GroupList, IList<INavigateModule> m_ModuleList);
19:
20: /// <;summary>
21: /// 加载/打开指定模块,响应系统的模块打开操作。
22: /// <;/summary>
23: /// <;param name="module">模块实例。</param>
24: void OpenModule(object module);
25:
26: /// <summary>
27: /// 关闭当前模块(活动的模块)。
28: /// <;/summary>
29: void CloseModule();
30:
31: /// <summary>
32: /// 关闭指定模块。
33: /// <;/summary>
34: /// <;param name="module">模块实例。</param>
35: void CloseModule(object module);
36:
37: /// <summary>
38: /// 切换导航,展开、隐藏导航,主界面没有导航的隐藏、展开需求可以不处理。
39: /// <;/summary>
40: void SwitchNavigation();
41:
42: /// <summary>
43: /// 当前活动插件/模块。
44: /// <;/summary>
45: object ActiveAddIn
46: {
47: get;
48: }
49:
50: /// <;summary>
51: /// 已打开的插件/模块集合。
52: /// <;/summary>
53: List<;object> AddIns
54: {
55: get;
56: }
57: }
58: }
其中InitializeShell方法:用于平台传入当前系统登录人员所具有权限的模块清单及相关的导航清单,由自定义界面实现界面的初始化。
OpenModule方法:用于实现对模块的打开,平台传入要打开的模块,由主界面进行处理,实现主界面对模块的动态加载。
CloseModule方法:用于关闭已经打开的模块,并对界面进行清理。
SwitchNavigation方法:切换导航,展开、隐藏导航,主界面没有导航的隐藏、展开需求可以不处理。
ActiveAddIn属性:向平台返回当前的活动模块。
AddIns属性:向平台返回已加载的模块清单。
四、自定义界面实例
近期 有朋友建议使用devcomponents或者DotNetBar为大家演示一下如何自定义平台的主体界面,参考了网有对devcomponents和DotNetBar相关的资料之后我们选择了较为轻量级的DotNetBar为大家演示如何替换系统的主界面。
我们使用DotNetBar所提供的一些控件实现了以下三种风格的主体界面:
第一种是Win7/Ribbon风格的主界面RibbonShell,如下图所示:
其对应代码为DrugShop案例之中的DrugShop.Res项目之中的RibbonShell.cs程序文件。
第二种为类似Visual Studio界面风格的DockableShell,其效果如下:
其对应代码为DrugShop案例之中的DrugShop.Res项目之中的DockableShell.cs程序文件。
第三种为不包含导航栏的简单MDI界面风格的TabShell,其效果如下:
其对应代码为DrugShop案例之中的DrugShop.Res项目之中的TabShell.cs程序文件。
五、关于代码
以上介绍了三种风格的自定义主界面的例子,例子不多,也不复杂,或许也不能满足所有人的美观度需求和功能需求,其目的在于抛砖引用,希望借此文让更多的开发者加入到我们的行列之中来,做出更加美观大方的界面。
关于以上三种风格自定义界面代码,我们已经合并到DrugShop案例和SmartEPR案例之中,请大家在AgileEAS.NET SOA中间件官方网站的最新下载栏目进行下载。
在启动自定义界面的过程之中切记要修改资源项目之中IResource的实现代码之中的GetMainShell方法代码:
1: public object GetMainShell()
2: {
3: return new RibbonShell(); //Ribbon风格自定义界面。
4: //return new DockableShell(); //Dockable风格自定义界面。
5: //return new TabShell(); //TabMdi风格自定义界面。
6: //return null; //使用AgileEAS.NET SOA平台自带界面。
7: }
本文所使用的是DotNetBar115版本,有关于DotNetBar115请通过http://42.121.30.77/downloads/DotNetBar115.rar下载。
六、联系我们
为完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。
AgileEAS.NET SOA中间件平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。
我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。
AgileEAS.NET网站:http://www.agileeas.net
官方博客:http://eastjade.cnblogs.com
github:https://github.com/agilelab/eas
QQ:47920381
QQ群:113723486(AgileEAS SOA 平台)/上限1000人
199463175(AgileEAS SOA 交流)/上限1000人
212867943(AgileEAS.NET研究)/上限500人
147168308(AgileEAS.NET应用)/上限500人
172060626(深度AgileEAS.NET平台)/上限500人
116773358(AgileEAS.NET 平台)/上限500人
125643764(AgileEAS.NET探讨)/上限500人
193486983(AgileEAS.NET 平台)/上限500人
邮件:james@agilelab.cn,mail.james@qq.com,
电话:18629261335。
使用DotNetBar制作漂亮的WinFrom界面,自定义AgileEAS.NET SOA平台WinClient主界面的更多相关文章
- WinForm触摸屏程序功能界面长时间不操作自动关闭回到主界面 z
操作者经常会在执行了某操作后,没有返还主界面就结束了操作然后离开了,程序应该关闭功能窗体自动回到主界面方便下一位操作者操作.那么对于WinForm程序怎么实现呢? 实现原理:拦截Application ...
- 【Android】7.0 第7章 简单适配器和布局--本章示例主界面
分类:C#.Android.VS2015: 创建日期:2016-02-09 修改日期:2016-02-13 一.在AssemblyInfo.cs文件中配置应用程序清单 前面的章节我们说过,除了在And ...
- Angular创建路由从主界面跳转到我们的cesium界面
我们要在一个独立的顶级模块中加载和配置路由器,它专注于路由功能,然后由根模块 AppModule 导入它. 按照惯例,这个模块类的名字叫做 APPRoutingModule,并且位于 src/app ...
- Qt之实现360安全卫士主界面代码开源
匆匆一年又过去了,总结去年一年的节奏就是忙爆了:生活忙.工作忙,值得庆幸的是没有瞎忙:今天打开博客园查看我的博客,才发现几乎差不多一年时间没写博客了:博客文章就是记忆,就是曾经努力过的见证,感谢博客园 ...
- css制作漂亮彩带导航条菜单
点击这里查看效果:http://keleyi.com/keleyi/phtml/divcss/17.htm 效果图: 以下是源代码: <!DOCTYPE html PUBLIC "-/ ...
- 使用 CSS3 & jQuery 制作漂亮的书签动画
今天的教程是关于创建使用 CSS 旋转变换和 JavaScript 制作动画书签效果.我们的想法是展现出样书状结构,使单一的色板或列表点击切换.当点击其中一项,我们就会旋转以显示所选择的项目. 在线演 ...
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...
- CSS3制作漂亮的照片墙
CSS3可以做动画大家肯定都是耳熟能详的了,但是大家有木有巧妙的利用这一个功能来制作一款漂亮的照片墙呢? 那么今天我们就利用CSS3动画这一特性来一起制作漂亮的照片墙吧! 第一部分:HTML 这里我们 ...
- Inno Setup技巧[界面]自定义安装向导小图片宽度
原文 blog.sina.com.cn/s/blog_5e3cc2f30100cj7e.html 英文版中安装向导右上角小图片的大小为55×55,汉化版中为55×51.如果图片超过规定的宽度将会被压 ...
随机推荐
- 快速上手php:使用PhpStrom部署项目
闲话 上学的时候一直以为可以专注自己的领域,以为与php无缘的,但是这种想法是错误,在完成任务的时候,你不得不使用你不熟悉的语言或者框架.正所谓业务驱动开发,这次接手已经离职的前辈的留下来的项目,最蛋 ...
- BZOJ4533 [BeiJing2014 WinterCamp] 数据
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- CUDA程序设计(一)
为什么需要GPU 几年前我启动并主导了一个项目,当时还在谷歌,这个项目叫谷歌大脑.该项目利用谷歌的计算基础设施来构建神经网络. 规模大概比之前的神经网络扩大了一百倍,我们的方法是用约一千台电脑.这确实 ...
- bc#54 div2
用小号做的div2 A:竟然看错了排序顺序...白白WA了两发 注意读入一整行(包括空格):getline(cin,st) [gets也是资瓷的 #include<iostream> us ...
- RabbitMQ headers Exchange
Headers Exchange headers也是一种交换机类型,但是在rabbitmq官网中的教程中并没有说到.资料也很少,但是找一找总会有的. headers与direct的模式不同,不是使用r ...
- mysql中find_in_set()函数的使用
首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 .现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那我 ...
- ab 轻量的压测工具
阅读:http://www.cnblogs.com/luminji/archive/2011/09/02/2163525.html
- Asp.Net HttpContext.RemapHandler 用法
最近在看HttpHandler映射过程文章时发现Context对象中有一个RemapHandler方法,它能将当前请求映射到指定的HttpHandler处理,可跳过系统默认的Httphandler.它 ...
- 【URLDecoder】java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in es
Java调用 URLDecoder.decode(str, "UTF-8"); 抛出以上的异常,其主要原因是% 在URL中是特殊字符,需要特殊转义一下, 上面的字符串中'%'是一个 ...
- fzoj1314 You are my brother
题目描述 Little A gets to know a new friend, Little B, recently. One day, they realize that they are fam ...