热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

原文:我的VSTO之路(二):VSTO程序基本知识开始之前,首先我介绍一下我的开发环境:VS2010+Office2010,是基于.Netframework4.0和VSTO4.0。以
原文: 我的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

 

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

在Ribbon上添加按钮

 

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

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

按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。

优化Ribbon

 

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

添加到TabHome

 

运行界面

TabHome

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

 

添加Task Pane

创建Task Pane

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

1 UserControlForTP

 

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

2 UserControlForTP View

 

在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:      }

 

运行结果:

3 TaskPaneResult

 

将Task Pane与Ribbon关联

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

4 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


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
author-avatar
小兔纸77
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有