天天看點

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

1 簡單界面架構概述

1.1 界面架構插件概述

我們先來看一下要建立的這個界面架構,如下圖所示。這個界面架構是一個上下型布局風格,上部分是菜單,下部分是多标簽頁的内容區域。菜單由其它插件來提供,并且點選菜單時在内容區域顯示其它插件注冊的窗體或者使用者控件。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

下圖示範了其它插件如何通過配置将界面元素注冊到這個界面架構。在下圖,DemoPlugin這個插件定義了一個Extension擴充節點,其對應擴充點為UIShell.Applications,并且底下定義了Application和Menu節點。當DemoPlugin插件被OSGi.NET核心安裝後,它就将這個擴充資訊注冊到核心;接着界面架構就可以擷取到相應的擴充資訊,并在界面上建立了對應的菜單,并且在點選菜單時,将插件提供的窗體顯示在内容區域裡。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

1.2 先嘗試一下這個界面架構

1.2.1 下載下傳安裝iOpenWorksSDK

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

1.2.2 建立項目,下載下傳該插件

運作VS 2008(支援VS2005/2008/2010,以2008為例),然後建立一個iOpenWorks主程式。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

建立完成後,按F5,運作這個項目,并在插件中心中下載下傳這個簡單的界面架構插件。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

下載下傳安裝完成後,點選“重新開機系統”按鈕,你發現已經安裝了這個界面架構插件了。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

它已經包含了一個系統管理的菜單,這是因為系統管理菜單已經定義了一個如下的擴充資訊,該格式的擴充會注冊到OSGi.NET并被界面架構擷取,然後建立相應的界面元素。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

<Extension Point="UIShell.Applications"> 

  <Application Title="系統管理" ToolTip="系統管理" Icon="UIShell.WinFormAppCenterPlugin.Resources.shell.png"> 

    <Menu Text="插件中心" ToolTip="插件中心" Icon="UIShell.WinFormAppCenterPlugin.Resources.shell.png" Class="UIShell.WinFormAppCenterPlugin.AppCenterUserControl"/> 

    <Menu Text="插件管理" ToolTip="插件管理" Icon="UIShell.WinFormAppCenterPlugin.Resources.shell.png" Class="UIShell.WinFormAppCenterPlugin.BundleManagementUserControl"/> 

  </Application> 

</Extension>

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

接下來,我們可以添加一個已有的項目,把剛才下載下傳的界面架構的源碼添加到目前項目。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

下面我們來通過源碼學習一下如何來建構這樣的界面架構插件了。

2 建構一個簡單界面架構

2.1 建立擴充模型

這個界面架構通過OSGi.NET的擴充點-擴充機制實作了界面的擴充,允許其它插件通過定義擴充的方式将界面元素注冊到該界面架構。這個架構接受的擴充配置如下所示。擴充點名稱為UIShell.Applications,底下是Application和Menu定義。Application對應于界面菜單的根節點,Menu表示這個插件的所有菜單配置,支援嵌套方式。每個Menu可以定義一個Class屬性,表示點選這個菜單時,在内容區域顯示的窗體或者使用者控件全名稱。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

2.2 建立擴充模型對象

當我們定義後界面架構接受的擴充資訊的格式後,我們需要定義相應的擴充對象了。你可以檢視源碼的ExtensionModel目錄下的3個檔案。WinShellApplication和WinShellMenu對應Extension資訊裡面的Application和Menu XML節點配置,WinShellApplicationContainer是WinShellApplication對象容器。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

WinShellApplicationContainer是一個單例的對象,它用于将Extension對象轉換成WinShellApplication,并為插件維護所有WinShellApplication對象。這個類提供了如下四個接口: 

(1)AddApplicationForExtension(Extension):将Extension轉換成WinShellApplication,并添加到緩存,然後傳回該對象 

(2)RemoveApplicationForExtension(Extension):删除Extension對應的WinShellApplication對象。 

(3)GetWinShellApplication(IBundle):擷取一個插件注冊的擴充資訊對應的WinShellApplication對象。 

(4)GetTopWinShellMenus(IBundle):擷取一個插件注冊的擴充資訊對應的一級菜單清單。 

WinShellApplication類對應擴充的Application XML節點,其Title、ToolTip、Icon屬性對應XML相應屬性,Bundle表示定義這個節點的插件,Menus表示子菜單集合。

WinShellMenu類對應擴充的Menu XML,其Text、ToolTip、Icon屬性對應相應XML屬性,ClassName對應Class屬性,Application表示所屬的WinShellApplication對象,Parent表示父菜單對象,Children表示子菜單對象清單。

建立擴充模型後,我們接着要來建立一個主界面了。

2.3 建立主界面

輕按兩下MainForm.cs打開主界面設計器。主界面為上下布局,上部分是一個MenuStrip,下部分是一個TabControl。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

下面我們将通過OSGi.NET的擴充機制,将其它插件注冊的擴充資訊轉換成這個主界面的菜單項。

2.4 處理擴充點,将擴充資訊轉換成界面元素

選擇MainFormExtensionHandler.cs檔案,按F7檢視這個檔案的源碼。該檔案擷取OSGi.NET擴充資訊并監聽擴充變更事件,然後将擴充轉換成主界面的界面元素。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

首先,我們先看一下如何擷取擴充資訊并監聽事件。代碼如下,在HandleExtension方法中,我們通過BundleContext插件上下文的GetExtensions來擷取界面架構定義的擴充點的所有已有擴充資訊,然後通過ApplicationContainer将擴充轉換成WinShellApplication對象,并為其建立相應菜單,接着監聽擴充變更事件。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

以下代碼是擴充變更事件處理,當插件啟動時,其擴充資訊注冊到OSGi.NET核心,當插件解除安裝時,其擴充資訊會被解除安裝掉,是以,就觸發這個事件。在這裡,當擴充資訊新增時,我們需要為其建立菜單項;反之,需要删除菜單項和已經顯示的内容。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

下面我們看一下為WinShellApplication建立相應界面元素的代碼,這裡我們利用該對象建立了一個頂層菜單項和所有子菜單項。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

以下是移除界面元素的源碼。

釋出一個簡單界面架構源碼,教你一步一步編寫通用界面架構

有關源碼更多的細節,你可以自己浏覽一下,如果有更多問題可以加入OSGi.NET插件倉庫QQ交流群:121369588。

本文轉自道法自然部落格園部落格,原文連結:http://www.cnblogs.com/baihmpgy/archive/2012/05/30/2526460.html,如需轉載請自行聯系原作者