幾個月前看過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的了吧。
我們的插入窗口其實一點兒也不華麗,但是卻很實用。另外,我們還有一個 工具類來專門進行內容處理:
1: public static void Process(string originalContent)
2: {
3: ProcessedContent = (!String.IsNullOrEmpty (originalContent)
4: ? String.Format("<p>{0}<br/><hr>-- Insert by <b>Autumoon Lab</b>.</p>", originalContent.ToUpper())
5: : String.Empty);
6: }
這個方法對用戶需要插入的文本進行了簡單地處理,大家只要掌握了Live Writer插件的開發方式,就可以天馬行空,自由發揮了。
然後我們編譯代碼,再將編譯後的dll文件拷貝到Windows Live Writer安裝 目錄下的Plugins文件夾裡,然後打開運行Live Writer就可以看到側邊欄裡已經 有我們創建的插件了。
我衷心希望接下來不久的時間就可以看到有更多的同學開發出更多更好更強 大的Live Writer插件,看到更多更好更精辟的技術文章!