软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > 电脑教程 > 编程开发 > .NET技术 > Silverlight4中使用MEF实现页面的动态装配(2)

Silverlight4中使用MEF实现页面的动态装配(2)

4 现在开发进行“动态装配”的Silverlight页面(位于DynamicComposePage项目Views文件夹中的Home.xaml)。

在页面上放置一个Button用于启动装配过程,另一个TextBlock用于显示提示信息,更重要地,放置一个ContentControl作为部件容器,用于显示动态装配出来的页面部件:

<StackPanel>

<Grid x:Name="LayoutRoot">

……

</Grid>

<Button x:Name="btnShowEditor"

Click="btnShowEditor_Click" ……/>

<TextBlock x:Name="txtInfo" ……/>

<ContentControl x:Name="MyEditorContainer"/>

</StackPanel>

下面简介一下此页面中的关键代码。

首先,我们需要指定Home.xaml页面“需要”一个IMyPart部件,为此,我们给Home类添加以下属性,并且给其附加“[Import]”标记:

[Import(typeof(IMyPart))]

public IMyPart mypart { get; set; }

在Home.xaml页面初次显示时,并不加载部件程序集,当用户点击按“我要编辑文本”按钮后,动态创建一个WebClient对象从Web网站上下载程序集:

private void DownloadAssemblyAndCompose()

{

//获取程序集的URI

string uri = Application.Current.Host.Source.AbsoluteUri;

int index = uri.IndexOf("/ClientBin"); //找出根URL

uri = uri.Substring(0, index) + "/MyParts/MyPageParts.dll";

WebClient client = new WebClient();

this.txtInfo.Text = "正在下载文本编辑器组件……";

client.OpenReadCompleted += new

OpenReadCompletedEventHandler(client_OpenReadCompleted);

//启动异步下载

client.OpenReadAsync(new Uri(uri));

this.btnShowEditor.IsEnabled = false;//防止用户第二次启动下载……

}

注意:

在本示例中我们假设所有的可装配部件都放在Web网站的MyParts文件夹下,并且假设我们已经知道了要下载的程序集文件名。在实际项目中,我们可以设计一个用于扫描部件文件夹并向Silverlight客户端返回可装配部件的WCF Service,以允许真正“全动态”的装配工作。

上述代码为WebClient的下载完毕事件(OpenReadCompletedEvent)挂接了一个事件响应方法,其中包容了本例最核心的功能代码:

void client_OpenReadCompleted(object sender,

OpenReadCompletedEventArgs e)

{

//加载资源

AssemblyPart part = new AssemblyPart();

Assembly ass = part.Load(e.Result); //提取程序集

//创建Catalog

AssemblyCatalog cata = new AssemblyCatalog(ass);

CompositionContainer container = new CompositionContainer(cata);

CompositionBatch bat = new CompositionBatch();

bat.AddPart(this);

container.Compose(bat);//装配……

//显示装配好的页面组件

if (mypart != null)

MyEditorContainer.Content = mypart;

}

上述代码中的关键在于下载程序集完成之后,从流中动态加载程序集,然后再调用MEF来装配部件。

相关阅读
栏目导航
推荐软件