几个月前看过Channel9上的一个视频,Windows Live Writer的开发经理 Charles Teague现场讲述如何开发Writer插件。昨天又看了徐晓卓同学的 WebCast,感觉内容雷同,看完之后觉得食不尽兴,并且在一些细节地方我对该 同学有异议。其实我与徐晓卓同学素未谋面,更谈不上江湖过节,只不过是想综 合他和Charles的内容,总结归档,给其他想要涉足Live Writer插件开发的同学 一点儿入门级参考资料罢了。我希望晓卓同学看了我的文章不要生气,我不是说 你代码写错了,只是有一个比较明显的地方,你既然在MSDN WebCast上写代码, 我觉得还是有必要遵守微软的编码规范,例如局部变量的声明,首字母应该小写 ,虽然你大写了并不影响编译。总而言之,我不提倡文人相酸,只奉行共同进步 。
言归正传,这篇文章里的代码量不大,但整个Solution我已经放到CodePlex 上去了,大家可以直接到http://www.codeplex.com/WriterPlugin查看或下载所 有源代码。
微软已经发布了Windows Live Writer SDK,其中主要分为三个部分:
Application API
用于启动Live Writer应用程序以及编辑现有数据类型,例如:超链接、文本 、图片等;
Content Source Plugin API
用于扩展新数据类型的支持能力;
Provider Customization API
用于自定义现有功能以及增添新的功能;
本文主要讲述Application API的开发练习,我相信大家只要明白了如何利用 Application API做自己想要做的事情,那么其它两个API也就触类旁通了。
简单介绍一下应用场景:可能因为也许需要,某些人需要往Live Writer中插 入一些文本内容,并且这些文本内容在插入的时候总是需要经过固定的处理流程 ,类似于给图片加水印一样,因此简单的复制粘贴就显得不够用了,需要我们另 外给他开发一个独立的应用程序来做处理工作吗?那我写这篇文章做啥!
首先打开Visual Studio 2008,新建一个Class Library类型的项目,创建好 了以后要添加Application API的动态链接库文件的引用,不用到MSDN上去下载 ,安装了Live Writer之后即可在安装目录下找到这个 WindowsLive.Writer.Api.dll文件。然后如果你的插件需要打开Windows窗口, 那么还需要添加System.Windows.Forms等引用。
根据我们假想场景的业务需要,我们需要有一个Windows窗口,用于接收用户 需要插入的原始文本内容,然后进行处理,也就是将字符串变成大写并在后面添 加Autumoon Lab的标记。需要注意的是,我们往Live Writer中插入文本内容时 要切记应该使用HTML标签,而不是C#的一些转义字符,例如要用"<br/>" 而不是"\n"等。
代码将如何按照我们的想法来工作呢?我们首先声明一个类AutumoonPlugin ,继承ContentSource类,并且重载其中的CreateContent用于实现我们自己的文 本插入流程:
1: [WriterPlugin("7c371eef-e350-4aae-af28-91613a9137e3", "Autumoon", PublisherUrl = "http://www.Autumoon.com", Description = "This is an Autumoon Lab plugin.", Name = "Autumoon")]
2: [InsertableContentSource("iAutumoon", SidebarText = "iAutumoon")]
3: public class AutumoonPlugin : ContentSource
4: {
5: public override DialogResult CreateContent(IWin32Window dialogOwner, ref string content)
6: {
7: new ProcessForm().ShowDialog();
8:
9: content = ContentProcessor.ProcessedContent;
10:
11: return DialogResult.OK;
12: }
13: }
需要给这个类添加两个特性:WriterPlugin和InsertableContentSource。并 设置其中属性的值。根据属性名大家就可以明白是什么意思,我就不再赘述了, 强调一点,WriterPlugin第一个参数是id值,大家可以自行设置,我只是用了一 个Guid值而已,不要被迷惑了。
根据上面几行代码大家就可以看出来我们的流程:打开窗口接受用户的插入 内容;从一个固定的地方去获取处理之后的文本,然后通过DialogResult.OK来 告诉Live Writer插入content,这下明白content为啥是ref的了吧。