成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Visual Studio 2010中Silverligh實現頁面動態裝配

開發 后端
.NET 4.0中提供了一個MEF框架用于開發支持插件的軟件系統,幸運的是,Silverlight 4也支持MEF,這就使得我們可以很容易地實現頁面的動態裝配功能。

.NET 4.0中提供了一個MEF框架用于開發支持插件的軟件系統,幸運的是,Silverlight 4也支持MEF,這就使得我們可以很容易地實現頁面的動態裝配功能。

用戶在訪問Silverlight應用程序時,開始可以只顯示一個“初始的簡單的”頁面,當用戶需要時,動態從Web網站上下載新的程序集,然后,Silverlight客戶端應用程序再使用MEF將動態下載的程序集中所包容的頁面組件“組裝”為一個新的功能增強了的頁面,示例解決方案DynamicComposePage展示了相關的技術細節。下面簡要介紹一下其開發步驟。

1 使用Visual Studio 2010創建一個名為DynamicComposePage的Silverlight Business Application項目,Visual Studio 2010將會幫助我們創建一個名為DynamicComposePage.Web的ASP.NET網站,它引用名為DynamicComposePage的Silverlight項目。

在解決方案資源管理器中展開DynamicComposePage項目節點,在其Views文件夾下可以看到Visual Studio 2010生成的一個Home.xaml頁面,等一會我們將修改此頁面實現頁面的動態裝配。

2 現在需要提供一個MEF部件都遵循的接口,為此,向解決方案中添加一個“Silverlight類庫(Silverlight Class Library)”項目[1]MyPartContract,并向其中添加一個IMyPart接口,為簡單起見,本例不為此接口添加任何成員,當然,在實際開發中可以依據需要為其添加合適的成員。

  1. namespace MyPartContract  
  2.  
  3. {  
  4.  
  5. public interface IMyPart  
  6.  
  7. {  
  8.  
  9. }  
  10.  

注意:這不是普通的“類庫”項目,Silverlight所使用的程序集是重新編寫的,與標準的.NET Framework不一樣。

3 下面定義可供動態組合的Silverlight頁面組件。

向示例解決方案中添加一個名為“MyPageParts”的“Silverlight類庫(Silverlight Class Library)”項目,注意在彈出的對話框中選擇“Silverlight 4”。然后,向MyPageParts項目中添加一個“Silverlight User Control”,取名“MyEditorControl”,在這個頁面中我們將放置一個RichTextArea控件充當文字編輯器:

  1. <UserControl x:Class="MyPageParts.MyEditor" ……> 
  2. <RichTextArea x:Name="MyEditorControl" …… /> 
  3. </UserControl> 

現在,需要讓此用戶控件可以被MEF動態裝配,為此,需要完成兩個步驟:

(1)給本項目(也包括前面創建的Silverlight項目DynamicComposePage)都添加對包容了IMyPart接口的Silverlight類庫MyPartContract的引用。

(2)給本項目(也包括前面創建的Silverlight項目DynamicComposePage)都添加對MEF核心程序集System.ComponentModel.Composition.dll的引用,將要負責完成“裝配”工作的Silverligh項目DynamicComposePage還需要添加對另一個核心程序集System.ComponentModel.Composition.Initialization.dll的引用。注意:在以下位置才能找到上述程序集:C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Libraries。下面是支持MEF動態裝配的Silverlight 4用戶控件的相應代碼,注意其中的“[Export]”標記:

Silverlight 4用戶控件

  1. [Export(typeof(IMyPart))]   
  2. public partial class MyEditor : UserControl,IMyPart  
  3.  
  4. {  
  5.  
  6. public MyEditor()  
  7.  
  8. {  
  9.  
  10. InitializeComponent();  
  11.  
  12. }  
  13.  

4 現在開發進行“動態裝配”的Silverlight頁面(位于DynamicComposePage項目Views文件夾中的Home.xaml),在頁面上放置一個Button用于啟動裝配過程,另一個TextBlock用于顯示提示信息,更重要地,放置一個ContentControl作為部件容器,用于顯示動態裝配出來的頁面部件:

  1. <StackPanel> 
  2. <Grid x:Name="LayoutRoot"> 
  3. ……  
  4. </Grid> 
  5. <Button x:Name="btnShowEditor"   
  6. Click="btnShowEditor_Click" ……/> 
  7. <TextBlock x:Name="txtInfo" ……/> 
  8. <ContentControl x:Name="MyEditorContainer"/>   
  9. </StackPanel> 

#p#
下面簡介一下此頁面中的關鍵代碼,首先,我們需要指定Home.xaml頁面“需要”一個IMyPart部件,為此,我們給Home類添加以下屬性,并且給其附加“[Import]”標記:

  1. [Import(typeof(IMyPart))]   
  2. public IMyPart mypart { get; set; } 

在Home.xaml頁面初次顯示時,并不加載部件程序集,當用戶點擊按“我要編輯文本”按鈕后,動態創建一個WebClient對象從Web網站上下載程序集:

  1. private void DownloadAssemblyAndCompose()  
  2.  
  3. {  
  4.  
  5. //獲取程序集的URI  
  6. string uri = Application.Current.Host.Source.AbsoluteUri;  
  7. int index = uri.IndexOf("/ClientBin"); //找出根URL  
  8. uriuri = uri.Substring(0, index) + "/MyParts/MyPageParts.dll";  
  9. WebClient client = new WebClient();  
  10. this.txtInfo.Text = "正在下載文本編輯器組件……";  
  11. client.OpenReadCompleted += new   
  12. OpenReadCompletedEventHandler(client_OpenReadCompleted);  
  13. //啟動異步下載  
  14. client.OpenReadAsync(new Uri(uri));  
  15. this.btnShowEditor.IsEnabled = false; //防止用戶第二次啟動下載……  
  16.  

注意:在本示例中我們假設所有的可裝配部件都放在Web網站的MyParts文件夾下,并且假設我們已經知道了要下載的程序集文件名。在實際項目中,我們可以設計一個用于掃描部件文件夾并向Silverlight客戶端返回可裝配部件的WCF Service,以允許真正“全動態”的裝配工作。上述代碼為WebClient的下載完畢事件(OpenReadCompletedEvent)掛接了一個事件響應方法,其中包容了本例最核心的功能代碼:

  1. void client_OpenReadCompleted(object sender,   
  2. OpenReadCompletedEventArgs e)  
  3.  
  4. {  
  5. //加載資源  
  6. AssemblyPart part = new AssemblyPart();  
  7. Assembly ass = part.Load(e.Result); //提取程序集  
  8. //創建Catalog  
  9. AssemblyCatalog cata = new AssemblyCatalog(ass);  
  10. CompositionContainer container = new CompositionContainer(cata);  
  11. CompositionBatch bat = new CompositionBatch();  
  12. bat.AddPart(this);  
  13. container.Compose(bat); //裝配……  
  14. //顯示裝配好的頁面組件  
  15. if (mypart != null)  
  16. MyEditorContainer.Content = mypart;  
  17.  

上述代碼中的關鍵在于下載程序集完成之后,從流中動態加載程序集,然后再調用MEF來裝配部件。

5 最后一步,在Web網站中創建一個專用的部件文件夾“MyParts”,將包容了可裝配部件的程序集復制到這一文件夾下。

創建MyParts文件夾

下圖展示了示例項目運行時動態下載并組裝頁面的截圖:

項目運行時動態

從本示例看到,將MEF和WebClient組件結合起來,可以讓我們實現Silverlight頁面的“按需下載”和“動態組合”,充分展示了Silverlight 4的強大功能!

【編輯推薦】

  1. Visual Studio 2010中Parallel類實現并行計算
  2. Visual Studio 2010中C++項目升級指南
  3. Visual Studio 2010中測試用例工作項類型介紹
  4. 在Visual Studio 2010選擇合適的項目測試方法
  5. 細數VS 2003到Visual Studio 2010的開發之路
責任編輯:王曉東 來源: 博客園
相關推薦

2009-08-21 13:29:20

Visual Stud

2010-01-28 09:07:50

Visual Stud

2009-12-02 09:43:38

Visual Stud

2009-11-10 13:43:37

Visual Stud

2010-03-11 15:23:44

Visual Stud

2010-09-25 08:50:00

Visual Stud

2010-02-22 16:43:33

Visual Stud

2009-11-11 09:48:06

Visual Stud

2010-03-19 13:17:26

Parallel

2010-03-19 16:43:37

Visual Stud

2009-11-24 09:00:02

Visual Stud

2010-07-15 08:50:09

SharePointVisual Stud

2010-07-20 08:43:00

Visual Stud

2009-07-02 10:07:24

C# 4.0的動態類型Visual Stud

2009-09-07 09:22:17

Visual Stud代碼片段

2010-05-14 15:05:38

Visual Stud

2009-09-02 16:21:17

Visual BasiC#語言

2010-04-12 08:43:45

Visual Stud

2009-11-11 14:26:13

Visual Stud

2009-11-18 09:14:49

Visual Stud
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: a视频在线 | 在线观看免费av片 | 日韩一区二区三区在线观看 | caoporn国产| 欧美aⅴ片 | 久久小视频 | www在线| 亚洲国产一区二区在线 | 久久成人国产 | 精品久久久久久 | 97免费在线观看视频 | 99免费精品 | 国产激情视频网站 | 9191av | 欧美日韩视频在线 | 天天精品综合 | 国产一区在线免费 | 日本黄色的视频 | 成人小视频在线观看 | 国产一区二区精华 | 精品国产免费一区二区三区演员表 | 一级免费看片 | 欧美精品一区二区在线观看 | 五月婷婷在线视频 | 日日日日日日bbbbb视频 | 一区二区三区四区在线 | 国产精品久久久久久久久久免费看 | 亚洲女人天堂成人av在线 | 国产乱码精品一区二区三区五月婷 | 日本久久精 | 色必久久 | 成人免费视频一区二区 | 亚洲欧美国产视频 | 国产黄视频在线播放 | 综合精品久久久 | 精品久久久久久亚洲综合网站 | 亚洲国产成人精品久久久国产成人一区 | 中文字幕第一页在线 | 国产高清免费在线 | 91视频在线看 | 99视频免费在线观看 |