使用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容器的主界面:

untitled

     其中包含以下組成部分:

 

     主菜單:界面最上部的主菜單,系統、視圖和幫助。

     導航菜單:通過菜單之中的菜單項可以打開指點的功能模塊。

     導航欄:同系統導航菜單、以樹形或者其他形式展示。

     狀態欄:顯示系統的一些狀態信息,如操作消息、當前登錄信息等。
     內容區:除以上項目外的界面空白區域為業務工作區,即模塊插件的工作區域,新打開的模塊在經區域顯示和工作。

     啟始頁:特指工作區之中第一個打開的模塊,當系統登錄完成之后會自動打開一個模塊,此模塊稱為起始頁模塊。

三、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,如下圖所示:

image

     其對應代碼為DrugShop案例之中的DrugShop.Res項目之中的RibbonShell.cs程序文件。

     第二種為類似Visual Studio界面風格的DockableShell,其效果如下:

image

     其對應代碼為DrugShop案例之中的DrugShop.Res項目之中的DockableShell.cs程序文件。

     第三種為不包含導航欄的簡單MDI界面風格的TabShell,其效果如下:

image

     其對應代碼為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推向市場,讓更多的人使用。

     我的技術團隊成員都是合作多年的老朋友,因為這個平台是免費的,所以也沒有什么收入,都是由程序員的那種理想與信念堅持,在此我感謝一起奮斗的朋友。

團隊網站:http://www.agilelab.cn

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。


免責聲明!

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



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