使用DotNetBar製作漂亮的WinFrom介面,自定義AgileEAS.NET SOA平臺WinClient主介面

魏瓊東發表於2013-12-19

一、前言

     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.smarteas.net

官方部落格:http://eastjade.cnblogs.com

QQ:47920381,AgileEAS.NET

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。

相關文章