zoukankan      html  css  js  c++  java
  • 探索 Word 2007 开发(一):我的博客

    探索 Word 2007 开发(一):我的博客

    Written by Allen Lee

    创建 Word 2007 插件项目

            这里,我将会使用Visual Studio 2008 Beta 2所带的VSTO(Visual Studio Tools for Office)来开发这个插件,此外,Office 2007也是必须的。

    Figure 1

            如上图所示,你首先需要确保选择了 .NET Framework 3.5的项目,接着选择Visual C#\Office\2007\Word Add-in作为项目模板(当然,你也可以选择Visual Basic下面的那个),然后依次输入解决方案名字和项目名字,最后按下OK完成项目的创建。

    Figure 2

            我们的项目包含了一个名为ThisAddIn.cs的代码文件,里面的ThisAddIn类就是我们的插件了。现在,我希望为Word 2007创建一个像Research那样的侧边栏,里面将包含与我的博客相关的信息:

    Figure 3

    创建"我的博客"侧边栏

            我不清楚以往怎样才能做到这样,但现在有了VSTO,你可以把以往所学的Windows Forms的技巧都用上,实际上,这样一个侧边栏就是一个用户控件(User Control)。现在,我们就来开发"我的博客"侧边栏。首先,在项目里添加一个名为MyBlogsUserControl的用户控件,接着在它上面拖放下列控件:

    • cbxBlogs:用于显示博客列表
    • btnViewBlog:在Internet Explorer中打开选定博客的主页
    • lbxRecentPosts:列出选定博客最近发布的帖子
    • btnViewPost:在Internet Explorer中打开选定帖子的网页
    • lbxDrafts:列出存在本地没有发布的帖子草稿
    • btnOpenDraft:在Word 2007中打开选定的帖子草稿

            MyBlogsUserControl在Visual Studio中的设计如下图所示:

    Figure 4

            接下来就是把MyBlogsUserControl嵌到Word 2007里了,要做到这样,最简单的办法就是在插件启动的时候,以Custom Task Pane的方式加载控件。回到ThisAddIn.cs,我们可以看到,Visual Studio为我们准备好插件的Startup事件的Event Handler了:

     

            这样,我们只需要在方法里面插入下面的代码:

     

            作为应用程序级别(application-level)的扩展,Office 2007引入了Custom Task Pane这个概念,然而,直接通过Office PIA使用Custom Task Pane比较繁琐,于是,VSTO提供了一个简化方案,正如Code #02所示的那样。

    增值服务区

            当然,别忘了引用VSTO的命名空间:

     

    考验脑力区

    • using关键字共有多少种用法?它们分别是什么?

            现在来看看运行效果:

    Figure 5

            到目前为止,"我的博客"侧边栏只是一个"空壳",接下来就是着手实现里面的逻辑了。

    填充"我的博客"侧边栏

            假设"我的博客"侧边栏的相关文件安置在My Blogs文件夹里,该文件夹的结构如下图所示:

    Figure 6

            虽然我们可以通过枚举My Blogs的子文件夹来填充cbxBlogs控件,然而我希望设计一个类来表示博客并且实现一定的数据绑定。回顾Figure 4,"我的博客"侧边栏应该具备如下特性:

    • 它会在启动时读取My Blogs文件夹里的相关信息,并且填充 cbxBlogs控件;
    • 当我们在博客列表中选择某个博客时,它会通过RSS获取该博客最近发布的帖子,并且填充lbxRecentPosts控件;
    • 当我们在博客列表中选择某个博客时,它会读取该博客帖子草稿文件夹里的数据,并且填充lbxDrafts控件;
    • 当我们在博客列表中选择某个博客时,按下View Blog按钮将会在Internet Explorer中打开该博客的主页;
    • 当我们在最近帖子列表中选择某个帖子时,按下View Post按钮将会在Internet Explorer中打开该帖子的网页;
    • 当我们在草稿列表中选择某个草稿时,按下Open Draft按钮将会在新的Word 2007中打开该草稿。

            明确这些需求后,我们就可以着手写代码了:

     

     

     

            对于Code #03,以下几点是需要说明的:

    • Post、Draft和Blog类都重写了ToString()方法,这是因为ComboBox和ListBox等控件会调用该方法并把返回的字符串用作条目的显示,重写该方法是为了让条目得到正确的显示。当然,如果你结合DataSource和DisplayMember来使用,也可以不重写ToString()方法。
    • Blog.GetRecentPosts()方法里使用Argotic Syndication Framework来进行RSS信息处理,所以你需要下载并安装它,然后在项目中引用相关的类库和Argotic.Core.Rss命名空间。
    • Blog.GetRecentPosts()方法里对RSS地址进行了假设,这个假设适用于博客园以及旗下其它网站,当然,你可以想出很多方法让它具备普遍适用性。
    • Blog.GetRecentPosts()方法里使用NetworkInterface. GetIsNetworkAvailable()方法判断当前网络是否连通,如果连通则获取数据,否则返回空数组。
    • Blog.GetDrafts()方法没有进行任何筛选,这里假设文件夹里面只包含.docx和/或.doc文件。由于这些文件将会用Word 2007打开,如果你可能往文件夹里放置Word 2007不能读取的文件,那么你最好为LINQ查询语句加入where来进行必要的过滤。
    • 在Blog.GetDrafts()方法里,我还假设My Blogs文件夹是放在"我的文档"里的,并且博客所在的文件夹名字和博客的名字一样,当然,这样我们就不能在博客的名字里面包含非法的路径字符了。

            我们可以让文件夹的名字和博客的名字相同,但却无法在这里包含博客的URL信息,而这又是很多操作的前提,于是我在My Blogs文件夹里放置一个Blogs.xml文件,里面包含了如下内容:

     

            有了这个文件,我们就可以顺利存取博客的URL信息了。另外,如果你希望让博客的名字不受路径的约束,即可以包含非法的路径字符,那么你可以为blog元素扩展一个directory属性用于存放路径,这样name属性就可以专门用于界面上的显示了。

    增值服务区

            接下来就是把数据填充到"我的博客"侧边栏了,回到MyBlogsUserControl.cs,在构造函数里添加如下所示的代码:

     

            对于Code #04,以下几点是需要说明的:

    • 我们使用LINQ to XML获取Blogs.xml中博客的相关数据,并把这些数据绑定到博客列表上。
    • 我们获取blogs元素的defaultBlog属性的值,并用它来设置cbxBlogs.SelectedText属性,使得它所指定的默认博客成为当前所选定的博客。
    • 如果我们约定第一个blog元素就是默认博客,那么这里就不需要使用defaultBlog属性和设置SelectedText属性了,因为当我们把一个数据源绑定到DataSource属性时,它会在完成绑定后把第一个条目设为当前选定项,当然,此时会引发SelectedValueChanged(和其它相关的)事件。

            噢,别忘记cbxBlogs的SelectedValueChanged事件,下面是该事件的Event Handler:

     

            值得提醒的是,Blog.GetRecentPosts()方法所返回的数组的元素个数和对应博客的设置相关:

    Figure 7

            现在来看看运行效果:

    Figure 8

    查看博客、最近帖子和存档草稿

            由于查看博客和查看最近帖子这两项操作都是"外包"给Internet Explorer的,我们可以简单地调用System.Diagnostics.Process.Start()方法,并传入选定对象的Url属性的值:

     

            对于存档草稿,我们可以使用Documents.Open()方法来打开,并传递选定存档草稿的Path属性的值:

     

            需要说明的是,对于Documents.Open()方法来说,除了第一个参数,其它参数都是可选的,但由于C#不支持这种可选参数,于是我们只好给它们传递Type.Missing。

            至此,"我的博客"侧边栏的开发要告一段落了,虽然我们还想让它变得更强大。作为一个Word 2007扩展插件,现在的"我的博客"侧边栏存在一个不可忽视的问题:它是随Word 2007启动而启动,而不是因用户的需要启动,并且一旦关闭就无法再次启动,除非重新打开Word 2007,这对于用户来说是无法接受的。下一回,我们将探讨扩展Word 2007的Ribbon,并尝试在它上面添加一个按钮来负责"我的博客"侧边栏的启动。

  • 相关阅读:
    Windows Azure Cloud Service (14) 使用Windows Azure诊断收集日志记录数据
    Windows Azure Cloud Service (13) 用Visual Studio 2010 将应用程序部署到Windows Azure平台
    Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session
    Windows Azure Storage (5) Windows Azure Drive
    Windows Azure Storage (7) 使用工具管理Windows Azure Storage
    SQL Azure(二) SQL Azure vs SQL Server
    webbrowser的自动提交
    提取视频的背景声音的软件
    Listview列排序的bug原因
    两个奇怪的问题
  • 原文地址:https://www.cnblogs.com/allenlooplee/p/898983.html
Copyright © 2011-2022 走看看