Silverlight开发身攻略(二)

  继上一篇《Silverlight开发身攻略(一)》,在上一节中我主要介绍了在实际开发中怎么动态加载图片资源的方法,并附有实例。在这一节中主要给大家介绍MEF(Managed Extensibility Framework)的知识来实现Xap包的动态加载。

  Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)以及Duck Typing等。MEF为开发人员提供了一个工具,让我们可以轻松的对应用程序进行扩展并且对已有的代码产生最小的影响,开发人员在开发过程中根据功能要求定义一些扩展点,之后扩展人员就可以使用这些扩展点与应用程序交互;同时MEF让应用程序与扩展程序之间不产生直接的依赖,这样也允许在多个具有同样的扩展需求之间共享扩展程序。简单的说:MEF程序设计主要Export (输出)、Import (输入)、Compose (组合)三个动作来完成。MEF的核心包括一个catalog和一个CompositionContainer。category用于发现扩展,而container用于协调创建和梳理依赖性。每个可组合的Part提供了一个或多个Export,并且通常依赖于一个或多个外部提供的服务或Import。每个Part管理一个实例为应用程序运行。
  关于MEF的基础知识在这里不是重点,大家可以在网上搜一下,有很多介绍这方面的文章。下面直截以实例转入正题。在实例中我们创建三个Silverlight Application项目,它们分别是:MEFLoadXap、FristXap、SecondXap。MEFLoadXap是主项目,它是一个容器,通过它来动态加载FristXap、SecondXap包。本实例环境是VS.net 2010 net4.0,在Net4.0中集成了MEF的功能。

  一、新建MEFLoadXap项目

1、用VS.net 2010新建名为MEFLoadXap的Silverlight Application项目,添加System.ComponentModel.Composition、System.ComponentModel.Composition.Initialization引用,如下图所示:

  2、在MEFLoadXap项目下添加DeploymentCatalogService.cs文件,在文件中添加IDeploymentCatalogService接口,并编写继承此接口的DeploymentCatalogService的类,此类主要封装了下载指定Xap包,自动导入带有Export属性标签类型为UserControl控件对象。

  IDeploymentCatalogService代码:

/// <summary>

/// 加载Xap服务接口

/// </summary>

public interface IDeploymentCatalogService

{

/// <summary>

/// 加载Xap包的方法

/// </summary>

/// <param name="uri">Xap包路径</param>

/// <param name="completedAction">加载完成后的事件</param>

void AddXap(string uri, Action<AsyncCompletedEventArgs> completedAction = null);

/// <summary>

/// 移除Xap包的方法

/// </summary>

/// <param name="uri">Xap包路径</param>

void RemoveXap(string uri);

}

  DeploymentCatalogService类的代码:

/// <summary>

/// 加载Xap服务类

/// </summary>

[Export(typeof(IDeploymentCatalogService))]

public class DeploymentCatalogService : IDeploymentCatalogService

{

private static AggregateCatalog _aggregateCatalog;

Dictionary<string, DeploymentCatalog> _catalogs;

public DeploymentCatalogService()

{

_catalogs = new Dictionary<string, DeploymentCatalog>();

}

/// <summary>

/// 初始化对象的静态方法

/// </summary>

public static void Initialize()

{

_aggregateCatalog = new AggregateCatalog();

_aggregateCatalog.Catalogs.Add(new DeploymentCatalog());

CompositionHost.Initialize(_aggregateCatalog);

}

/// <summary>

/// 加载Xap包的方法

/// </summary>

/// <param name="uri">Xap包路径</param>

/// <param name="completedAction">加载完成后的事件</param>

public void AddXap(string uri, Action<AsyncCompletedEventArgs> completedAction = null)

{

DeploymentCatalog catalog;

if (!_catalogs.TryGetValue(uri, out catalog))

{

catalog = new DeploymentCatalog(uri);

if (completedAction != null)

{

catalog.DownloadCompleted += (s, e) => completedAction(e);

}

else

{

catalog.DownloadCompleted += catalog_DownloadCompleted;

}

catalog.DownloadAsync();

_catalogs[uri] = catalog;

_aggregateCatalog.Catalogs.Add(catalog);

}

}

void catalog_DownloadCompleted(object sender, AsyncCompletedEventArgs e)

{

if (e.Error != null)

{

throw e.Error;

}

}

/// <summary>

/// 移除Xap包的方法

/// </summary>

/// <param name="uri">Xap包路径</param>

public void RemoveXap(string uri)

{

DeploymentCatalog catalog;

if (_catalogs.TryGetValue(uri, out catalog))

{

_aggregateCatalog.Catalogs.Remove(catalog);

_catalogs.Remove(uri);

}

}

}

3、修改设计Main
Page,在MainPage界面设计中我们把整个界面分为左、右两部分,左边放两个按钮,右边放一个容器控件用于承载显示动态下载Xap包中的控件,其Xaml代码如下:<Grid x:Name="LayoutRoot" Background="#FFD8D8D8">

<Grid.ColumnDefinitions>

<ColumnDefinition W
idth="200"></ColumnDefinition>

<ColumnDefinition Width="*"></ColumnDefinition>

</Grid.ColumnDefinitions>

<Button Height="36" Width="160" Margin="20,106,20,158" Content="加载一" Click="Button_Click"></Button>

<Button Height="36" Width="160" Margin="20,189,20,75" Content="加载二" Click="Button_Click_1"></Button>

<Border x:Name="parentContent" Grid.Column="1"></Border>

</Grid>

  MainPage类的CS代码:

public partial class MainPage : UserControl, IPartImportsSatisfiedNotification

{

public MainPage()

{

InitializeComponent();

//通过此方法调用DeploymentCatalogService对象

//自动将此对象与CatalogService属性邦定在一起

CompositionInitializer.SatisfyImports(this);

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

}

void MainPage_Loaded(object sender, RoutedEventArgs e)

{

LoadSelectedModule();

}

private string m_xapName = "FristXap.xap";

#region IPartImportsSatisfiedNotification Members

public void OnImportsSatisfied()

{

LoadSelectedModule();

}

#endregion

/// <summary>

/// 导入类型是IDeploymentCatalogService并带有Export属性标签对象

/// </summary>

[Import]

public IDeploymentCatalogService CatalogService { get; set; }

/// <summary>

/// 导入类型是UserContronl并带有Export属性标签的所有控件

/// </summary>

[ImportMany(AllowRecomposition = true)]

public Lazy<UserControl>[] mefModules { get; set; }

/// <summary>

/// 加载XAP包的方法

/// </summary>

private void LoadSelectedModule()

{

string selectXapName = m_xapName.Replace(".xap", ".");

CatalogService.AddXap(m_xapName);

var ctrs = (from m in mefModules.ToList()

where m.Value.ToString().Contains(selectXapName)

select m).FirstOrDefault();

if (ctrs != null)

{

parentContent.Child = ctrs.Value;

}

}

private void Button_Click(object sender, RoutedEventArgs e)

{

m_xapName = "FristXap.xap";

LoadSelectedModule();

}

private void Button_Click_1(object sender, RoutedEventArgs e)

{

m_xapName = "SecondXap.xap";

LoadSelectedModule();

}

}

  二、新建FristXap项目

  1、用VS.net 2010新建名为FristXap的Silverlight Application项目,添加System.ComponentModel.Composition、System.ComponentModel.Composition.Initialization引用

  2、删除FristXap项目下的App.xaml、MainPage.xaml文件,因它是被加载项目基本没有什么用处

  3、添加名为Ellipse.xaml用户控件,此控件主要作用是画一个椭圆。此控件效果图如下:

    控件Xaml代码如下:

<Grid x:Name="LayoutRoot" >

<Ellipse Height="300" Width="400" Fill="#FF3BC73B"></Ellipse>

<TextBlock Text="第一个XAP包中的椭圆控件" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="14"></TextBlock>

</Grid>

  三、新建SecondXap项目

  1、用VS.net 2010新建名为SecondXap的Silverlight Application项目,添加System.ComponentModel.Composition、System.ComponentModel.Composition.Initialization引用

  2、删除SecondXap项目下的App.xaml、MainPage.xaml文件

  3、添加名为Rectangle.xaml用户控件,此控件主要作用是画一个矩形。此控件效果图如下:

  四、编译运行项目,点击如下图所示的按钮动态加载FristXap.xap、SecondXap.xap包中的控件对象,加载过程是首先判断指定的包是否已下载到本地,如果在本地则直接加载;如果不在本地,则先到远程服务器上下载Xap包,后加载控件对象。运行效果图如下:

  本实例源代码:下载

时间: 2024-09-06 13:26:14

Silverlight开发身攻略(二)的相关文章

一起谈.NET技术,Silverlight开发廋身攻略(二)

继上一篇<Silverlight开发廋身攻略(一)>,在上一节中我主要介绍了在实际开发中怎么动态加载图片资源的方法,并附有实例.在这一节中主要给大家介绍MEF(Managed Extensibility Framework)的知识来实现Xap包的动态加载. Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)以及Duck Typing等.MEF为开发人员提供了一个工具,让我们可以轻松的对应用程序

Silverli“.NET研究”ght开发廋身攻略(二)

继上一篇<Silverlight开发廋身攻略(一)>,在上一节中我主要介绍了在实际开发中怎么动态加载图片资源的方法,并附有实例.在这一节中主要给大家介绍MEF(Managed Extensibility Framework)的知识来实现Xap包的动态加载. Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)以及Duck Typing等.MEF为开发人员提供了一个工具,让我们可以轻松的对应用程序

jspSmartUpload上传下载全攻略(二)

js|攻略|上传|下载 二.相关类说明篇 ㈠ File类 这个类包装了一个上传文件的所有信息.通过它,可以得到上传文件的文件名.文件大小.扩展名.文件数据等信息. File类主要提供以下方法: 1.saveAs作用:将文件换名另存. 原型: public void saveAs(java.lang.String destFilePathName) 或 public void saveAs(java.lang.String destFilePathName, int optionSaveAs) 其

Win 7系统安全优化、瘦身攻略

  首先 开启 Administrator 用户 删除其他用户!~~这个应该都会吧!~~ 1."以管理员身份运行,所有程序→附件→命令提示符",右击选择"以管理员身份运行", 进入命令提示符后,手工输入"powercfg -h off" 这是干什么的,木星人也会知道-- 2.关闭系统保护 计算机右键属性--高级管理设置--系统保护 3.转移虚拟内存 计算机右键属性--高级管理设置--高级--性能-设置-高级-更改 4.转移"用户的文件&

一起谈.NET技术,Silverlight开发廋身攻略(一)

相信大家在用Silverlight做应用开发时,随着项目的进展系统功能越来越多,肯定为Xap包越来越大而烦恼,Xap包的大小直接影响应用程序的加载速度,给用户造成不良的用户体验.我也曾为这个问题头痛过,经过在网上查阅资料和项目实践发现可通过以下三种方式给Silverlight应用程廋身. 1.定期检查系统项目模块的引用集,移除多余的引用库 2.图片资源文件,如果不是必须放在资源中的,可以采用按需加载 3.将系统划分成多个Silverlight项目,然后根据需要进行Xap加载 下面我将结合实例来对

Silverlight开发廋身攻略(“.NET研究”一)

相信大家在用Silverlight做应用开发时,随着项目的进展系统功能越来越多,肯定为Xap包越来越大而烦恼,Xap包的大小直接影响应用程序的加载速度,给用户造成不良的用户体验.我也曾为这个问题头痛过,经过在网上查阅资料和项目实践发现可通过以下三种方式给Silverlight应用程廋身. 1.定期检查系统项目模块的引用集,移除多余的引用库 2.图片资源文件,如果不是必须放在资源中的,可以采用按需加载 3.将系统划分成多个Silverlight项目,然后根据需要进行Xap加载 下面我将结合实例来对

Android抢红包助手开发全攻略_Android

背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生.需求:收到红包的时候进行提醒,然后跳转到红包的界面方便用户.思路:获取"读取通知信息"权限,然后开启服务监控系统通知,判断如果是微信红包就进行提醒(声音),然后跳转到红包所在的地方. 界面: 界面分为两部分,一部分是可以对App进行操作的,下面是一个可以滑动的界面,提示用户如何是软件正常工作,布局代码如下: <?xml version="1.0"

Win2003服务器组网、安全管理全攻略二

7.3389终端服务器的安全配置: 在本文第二节中,我们已经介绍了在Windows组件向导里安装3389终端服务器的方法,我们只须在Windows组件向导里勾选终端服务就可以使用终端服务远程管理服务器了.相信大家都玩过了3389的肉鸡,网络上大部份被黑客入侵的空口令肉鸡因为开放了3389终端远程管理服务,而被黑客不费吹灰之力就能取得远程管理权. 因为黑客们都是使用如 X-scan 等漏洞扫描软件,只要黑客扫描3389端口的机器,你的终端服务器就会暴露在黑客的眼前,那就对你的服务器存在一定的危险性

Vista+Office自动安装盘制作全攻略二

三.制作Office 2007自动安装应答文件 (一)Office 2007自动安装应答文件的制作 在Office 2003的时代,要进行自动安装,需借助一个名为"Office 2003 Editions Resource Kit Tools"的工具软件,来制作安装程序的自动应答文件.而Office 2007则进一步将自动安装应答文件的制作工具整合到其安装程序中,用户只需要按照以下步骤,即可制作出自动安装Office 2007所需的应答文件. 1.在预先准备的Office 2007安装