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

2023-10-20 18:40

本文主要是介绍Silverli“.NET研究”ght开发廋身攻略(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  继上一篇《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代码:

 
上海网站建设tyle="color: #808080;">/// <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 >上海闵行企业网站制作an> 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、修改设计MainPage,在MainPage界面设计中我们把整个界面分为左、右两部分,左边放两个按钮,右边放一个容器控件用于承载显示动态下载Xap包中的控件,其Xaml代码如下:
 
< Grid x:Name ="LayoutRoot" Background ="#FFD8D8D8" >
< Grid.ColumnDefinitions >
< ColumnDefinition Width ="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包,后加载控件对象。运行效果图如下:   

  本实例源代码:下载

转载于:https://www.cnblogs.com/waw/archive/2011/10/18/2217033.html

这篇关于Silverli“.NET研究”ght开发廋身攻略(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248972

相关文章

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁