原文:我的VSTO之路(二):VSTO程序基本知识

开始之前,首先我介绍一下我的开发环境:VS2010 + Office 2010,是基于.Net framework 4.0和VSTO 4.0。以下的范例代码都基于这个,如果你使用的是VS2008,那么问题也不大,基本可以移植过去。需要注意的是.Net framework 4.0中增加了dynamic类型可选参数,而这两点新的特性在VSTO 4.0中被广泛使用,新特性的详细内容我就不介绍了,(其实介绍的地方很多,Google一下就可以了),移植的时候需要稍微调整一下代码。

创建VSTO项目

环境搭建

要开发VSTO项目,环境搭建比较简单,微软这方面做得都做不错。只要安装了VS2010(需要勾选VSTO 4.0)和Office2010即可。VS2008配合Office2007也可以轻松搭建开发环境。

创建项目

选择创建新项目->C#->Office,然后选择Word 2010 Add-in,如下图:

可以看到图中除了Word 2010 Add-in,还有Word 2010 Document和Word 2010 Template这两种项目类型。它们的区别在于,Add-in属于Application level,即是一个插件,每次Word启动的时候都会加载这个插件。而Document和Template属于Document Level,这种项目会生成一个Word文件(Document项目会生成.docx文件,而Template会生成.dotx),你写的代码只有在运行这个特定的Word文件的时候才会起作用。

添加自定义的Ribbon

右击项目->添加新的Item->Office->Ribbon (Visual Designer),如下图:

往Ribbon上,添加一个按钮,并取名为Hello

双击Hello按钮,在OnClick中,添加如下代码:

   1:          private void btHello_Click(object sender, RibbonControlEventArgs e)
   2:          {
   3:              System.Windows.Forms.MessageBox.Show("Hello World!");
   4:          }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

按F5运行当前程序,VS会帮你自动开始一个新的Word实例,然后在Word中选择Add-ins标签页,点击Hello按钮。如果你顺利看到Hello Word!对话框,就说明你的第一个VSTO程序,顺利完成了。

对于我们的一个VSTO程序,我们做一些小的优化。从前一张图我们可以看到,我们的Ribbon和其他插件的Ribbon都挤在了Add-ins,这个Tabs中。我们现在要把我们的Ribbon独立出来。在VS中,打开Ribbon的设计界面,并选择Ribbon Tab,如下图,把ControlIdType改为Custom,然后把ControlID改为MyFirstAddin,这样我们的Ribbon会独占一个Ribbon Tab。

* 这里有个小Trick,如果你的客户希望你把自己建的Ribbon插入到Office自己的Ribbon里面去,我们也可以实现。把ControlIdType设定为Office,并把OfficeID设定为TabHome,如下图:

运行界面

其他的OfficeID可以到这里查看:Office 2010 IDsOffice 2007 IDs

添加Task Pane

创建Task Pane

Task Pane是一个很有用的控件,它可以驻留在Office程序的窗口上,让开发者更具自己的需求创建界面。首先我们先创建一个User Control,之后这个User Control将嵌入在Task Pane中。而我们所添加的代码,主要也加在这个User Control中。

在UserControl上放一个Label,我们暂时不在这里写进一步的代码:

在ThisAddIn.cs文件中,进行如下修改,这样在这样Addin被加载时,就会显示Task Pane:

   1:      public partial class ThisAddIn
   2:      {
   3:          public CustomTaskPane _MyCustomTaskPane = null;
   4:   
   5:          private void ThisAddIn_Startup(object sender, System.EventArgs e)
   6:          {
   7:              UCForTaskPane taskPane = new UCForTaskPane();
   8:              _MyCustomTaskPane = this.CustomTaskPanes.Add(taskPane, "My Task Pane");
   9:              _MyCustomTaskPane.Width = 200;
  10:              _MyCustomTaskPane.Visible = true;
  11:          }
  12:   
  13:          private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
  14:          {
  15:          }
  16:   
  17:          #region VSTO generated code
  18:          // 内容被省略
  19:          #endregion
  20:      }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

运行结果:

将Task Pane与Ribbon关联

我们已经完成了一个Task Pane,接下去要用之前创建的Ribbon控制Task Pane的显示。先对之前的Ribbon做一些修改,增加两个按钮,同时我们对界面做一些美化,具体步骤我这里不详述了,界面如下图:

为"Open Task Pane"和"Close Task Pane"添加Onclick事件,代码如下:

   1:          private void btnOpen_Click(object sender, RibbonControlEventArgs e)
   2:          {
   3:              if (Globals.ThisAddIn._MyCustomTaskPane != null)
   4:              {
   5:                  Globals.ThisAddIn._MyCustomTaskPane.Visible = true;
   6:              }
   7:          }
   8:   
   9:          private void btnClose_Click(object sender, RibbonControlEventArgs e)
  10:          {
  11:              if (Globals.ThisAddIn._MyCustomTaskPane != null)
  12:              {
  13:                  Globals.ThisAddIn._MyCustomTaskPane.Visible = false;
  14:              }
  15:          }
 
运行你的程序,便可以看到结果了。

本文总结

到这里,我介绍了VSTO的开发方法,以及Ribbon和Task Pane的基本知识,本文中的范例程序可以在这里下载:MyFirstAddin.zip。 在之后的文章中,我会深入介绍Word、Excel和Outlook的具体开发实例以及开发的细节。详细请看,我之前写的序,http://www.cnblogs.com/izualx/archive/2011/04/30/2033289.html

本文欢迎转载,但请保留出处,大家如果有问题,可以联系我 justin.tyrael@gmail.com

我的VSTO之路(二):VSTO程序基本知识的更多相关文章

  1. 我的VSTO之路(三):Word基本知识

    原文:我的VSTO之路(三):Word基本知识 在前一篇文章中,我初步介绍了如何如何开发一个VSTO程序,在本文中,我将进一步深入介绍Word的插件开发.Word是一个大家在日常工作中一直接触的文档工 ...

  2. 我的VSTO之路(四):深入介绍Word开发

    原文:我的VSTO之路(四):深入介绍Word开发 在上一篇文章中,我介绍了Word的对象模型和一些基本开发技巧.为了更好的介绍Word插件开发,我为本文制作了一个Word书签的增强版,具体功能是让用 ...

  3. 我的VSTO之路:序

    原文:我的VSTO之路:序 VSTO是微软提供给.Net开发人员的一个接口,通过他我们可以对Office程序做一些处理.但是这个接口并不尽善尽美,相比微软的很多其他产品,VSTO的稳定性并不好,相关的 ...

  4. 我的VSTO之路(五):Outlook初步开发之联系人扩展

    原文:我的VSTO之路(五):Outlook初步开发之联系人扩展 上一讲我们完成对Word的介绍,文本开始,我将着重介绍Outlook.Outlook是微软Office中一个非常实用的工具,尤其在一个 ...

  5. GO语言的进阶之路-go的程序结构以及包简介

    GO语言的进阶之路-go的程序结构以及包简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编辑,编译和运行 A,编辑 Go程序使用UTF-8编码的纯Unicode文本编写.大 ...

  6. Python程序基本知识

    Python程序基本知识 一. 数据类型与变量 1.1 变量 **变量:**在Python中不需要事先声明变量名及其类型,直接赋值即可创建各种类型的变量 x='Hello World' #创建了整型变 ...

  7. Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c

    Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c 课后作业 1. 编写 inotify_epoll.c, 用它来监测tmp/目录: 有文件被创建/删除, 有文 ...

  8. 9.12/ css3拓展、js基础语法、程序基本知识、数据类型、运算符表达方式、语句知识点

    css3拓展: <display:none>  将某个元素隐藏       <visibility:hidden>  也是将某个元素隐藏 <display:block&g ...

  9. 《JavaScript》 程序基本知识 数据类型。 {0912上} {0912下}

    JS脚本语言: 这是JaxaScript的全称名 JS是网页里面使用的脚本语言 JS是一个非常强大的语言 JS的基础语法 注释语法:  单行注释 //     多行注释 /**/ 输出语法:   双标 ...

随机推荐

  1. Android 颜色渲染(八) SweepGradient扫描/梯度渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Android 颜色处理(八) SweepGradient 扫描/梯度渲染 为什么什么叫扫描渲染呢?  相信大家都看过雷达扫描的 ...

  2. Android(java)学习笔记200:Android中View动画之 XML实现 和 代码实现

    1.Animation 动画类型 Android的animation由四种类型组成: XML中: alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动 ...

  3. 如何使用Jquery获取Form表单中被选中的radio值

     $("input[name='opType']:checked").val() -------此方法估计用的比较多,通俗易懂 $("input:radio:checke ...

  4. producer怎样发送消息到指定的partitions

    http://www.aboutyun.com/thread-9906-1-1.html http://my.oschina.net/u/591402/blog/152837 https://gith ...

  5. django连接已有的数据库

    以连接postgresql为例: 1.安装psycopg2,下载地址:http://www.stickpeople.com/projects/python/win-psycopg/ 2.配置setti ...

  6. ng-view和ng-include之间的区别

    ng-view通过使用路由控制,可以方便的实现页面组合,但一个html文件中,只能有一个ng-view,他是可以被ctl控制的.ng-include就是将多个页面的公共页面提取出来,如header.h ...

  7. Objective-C和C++的区别

    1.都是有C语言延伸而来2.OC是完全动态的,C++是部分动态的3.OC不支持多继承,通过代理 类别 协议优雅的实现了相关的一系列特性4.调用机制不同OC里面叫发送消息  C++叫做调用函数数5.OC ...

  8. jQuery - 获取内容和属性

    jQuery 拥有可操作 HTML 元素和属性的强大方法. jQuery DOM 操作 jQuery 中非常重要的部分,就是操作 DOM 的能力. jQuery 提供一系列与 DOM 相关的方法,这使 ...

  9. [转]一个备份MySQL数据库的简单Shell脚本

    本文翻译自 iSystemAdmin 的 <A Simple Shell Script to Backup MySQL Database> Shell脚本是我们写不同类型命令的一种脚本,这 ...

  10. select控件变成可输入状态

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...