如何扩展Expression Blend 4

  微软没有公开承诺支持扩展Expression Blend,也没有提供相关文档。但是Expression Blend在设计的时候就已经考虑了扩展性的问题,而且公开了扩展接口,所以我们完全可以使用这些接口来扩展它,最简便的方法便是使用MEF。

本文将介绍如何为Expression Blend写一个插件来扩展Expression Blend。
 
一、配置Extension项目
  由于Expression Blend是基于.Net4.0的,所以你必须使用VisualStudio 2010来创建一个.Net4.0的类库项目,推荐你使用“WPF自定义控件”模板来可以创建该项目。
  又由于Blend在查找插件的时候只在Microsoft
Expression\Blend 4\Extensions\目录下查找以.Extension.dll结尾的程序集,所以你必须修改你程序集的名字以.Extension结尾。而在部署或者调试的时候你必须把Extension程序集放在Microsoft Expression\Blend 4\Extensions\目录下:
  注意:此操作会导致调试的时候所有输出都放到该目录下,所以你需要把这个项目所有引用的程序集的复制到本地(copy local)属性设置为false。
 
  最后,为了能够调试你的程序,清将Blend设置为该项目的外部启动程序:
二、加载插件
 
  首先,请添加Microsoft.Expression.Framework,Microsoft.Expression.Extensibility这两个程序集的引用,它们都可以在Blend的安装目录下找到,并注意把他们的copy local属性设置为false。
  然后,添加一个Class并实现IPackage接口:
using Microsoft.Expression.Extensibility;
namespace MyExtension
{
class MyExtension : IPackage
{
#region IPackage Members
public void Load(IServices services)
{
}
public void Unload()
{
}
#endregion
}
}
 
  IPackage只有两个方法:Load和Unload。Load方法是你整个插件的入口,你可以在这里编写你的初始化逻辑并通过传入的IServices来获取你需要的服务,比如:ICommandService commandService = services.GetService<ICommandService>()。
 
  要使Blend能够自动的Load你的Package,你只需要使用MEF把它Export便可以了:
using System.ComponentModel.Composition;
namespace MyExtension
{
[Export(
typeof(IPackage))]
class MyExtension : IPackage
  现在,你的插件就能够被Blend加载了,你可以在Load方法中加一个断点并且按F5运行看看。
 
  当然,你也可以直接使用MEF来Import一个Service(有些Service可能无法Import,而只能用IServices去获取比如IDocumentTypeManager):
[Import]
internal ISolutionService SolutionService { get; set; }
 
三、完善插件
 
  现在,你就可以编写自己的插件逻辑了,你可以为Blend添加Window,添加菜单,甚至是你自己的文件类型。当然,它的扩展性远远不如VisualStudio。扩展Blend的整体思路是通过Service来注册你的组件。
 
  比如:我们可以使用IwindowService来为它注册一个窗口:
IWindowService service = services.GetService<IWindowService>();
UserControl uc
= new UserControl();
service.RegisterPalette(
"MyExtension", uc, "My Extension");
  
  按F5运行,打开Blend的Window菜单,就可以看到你刚注册的“My Extension”窗口了:
 
  当然,该窗口中只有一个UserControl,什么都不能干,你需要重写UserControl并通过其它Service完成其它功能。

四、其它:

  如果你对于扩展Expression Blend感兴趣,或者你需要知道一些如何扩展Expression Blend其它方面的信息,比如如何往Blend中添加模板,如何往Blend中添加新的文件类型等等,欢迎回帖。
posted on 2011-02-12 17:48  cylj.xu  阅读(2562)  评论(10编辑  收藏  举报