




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第40章Visual Studio Tools for OfficeVisual Studio Tools for Office(VSTO)技术可以使用.NET Framework定制和扩展Microsoft Office应用程序和文档,它包含的工具还可以使这个定制在Visual Studio中更容易完成,例如用于Office ribbon控件的可视化设计器。VSTO是微软公司发布的一系列产品中的最新产品,可以定制Office应用程序。用于访问Office应用程序的对象模型已经随时间逐步演化了。如果读者过去曾使用过它,就会熟悉它的某些部分。如果读者以前为Office应用程序编写过VBA插件,就为本章讨论的技术做好了准备(VSTO可以与VBA交互操作)。但VSTO通过Office Primary Interop Assemblies(PIAs)提供的、与Office交互的类已经扩展到Office对象模型之外。例如,VSTO类包括.NET数据绑定功能。在Visual Studio 2008推出之前,VSTO一直是一个独立下载的软件包,如果要开发Office解决方案,就可以得到它。在Visual Studio 2008中,VSTO集成到Visual Studio IDE中。VSTO的这个版本也称为VSTO 3,包含了对Office 2007的全部支持,还包括许多新特性,例如可以与Word内容控件交互,前面提及的ribbon可视化设计器、VBA集成等。本章不需要VSTO或其以前版本的任何预备知识。内容如下: 可以用VSTO创建的项目类型,在这些项目中可以包含的功能 应用于所有VSTO解决方案类型的基础技术 如何建立带定制UI、VBA交互操作功能和ClickOnce部署功能的VSTO解决方案40.1 VSTO概述VSTO包含如下组件: 一组项目模板,可用于创建各种类型的Office解决方案 设计器,支持ribbons、动作面板和定制任务面板的可视化布局 建立在Office Primary Interop Assemblies(PIAs)基础之上的类,它们还提供了扩展功能VSTO支持Office 2003和2007版。VSTO类库有两种形式,各用于这两种Office版本,它们分别使用不同系列的程序集。由于它们比较简单(且功能集很丰富),所以本章主要介绍2007版。VSTO解决方案的一般体系结构如图40-1所示。图 40-140.1.1 项目类型图40-2显示了Visual Studio中的项目模板。图 40-2提示:使用VSTO模板创建项目时,需要具备对VBA项目系统的访问权限。这是与VBA交互所必须的。VSTO项目模板可以分为如下类别: 文档级的定制 应用程序级的插件 SharePoint工作流模板 InfoPath窗体模板一些项目类型有2003和2007版,但这里只介绍2007版。本章主要讨论最常用的项目类型,即文档级的定制和应用程序级的插件。1. 文档级的定制创建这种类型的项目时,会生成一个链接到单个文档上的程序集,例如Word文档、Word模板或Excel工作簿。加载该文档时,关联的Office应用程序会检测到定制,加载程序集,使VSTO定制可以使用。这类项目可以给某个业务线上的文档提供额外的功能,或者在文档模板中添加定制功能,为这类文档添加额外功能。所包含的代码可以操作文档和文档的内容,包括内嵌的对象。还可以提供定制菜单,包括可以用Visual Studio Ribbon设计器创建的ribbon菜单。创建文档级的项目时,可以选择创建新文档,或者复制已有的文档,作为开发的起点。也可以选择要创建的文档类型。例如,对于Word文档,就可以选择创建.docx(默认)、.doc或.docm文档(.docm是支持宏的文档)。其对话框如图40-3所示。图 40-32. 应用程序级的插件应用程序级的插件不同于文档级的定制,因为前者可用于整个目标Office应用程序。我们可以访问插件代码,其中可以包含菜单、文档操作等,而无论加载什么文档。启动某个Office应用程序如Word时,它会寻找已在注册表中有数据项的关联插件,并加载需要的程序集。3. SharePoint工作流模板这些项目提供了创建SharePoint工作流应用程序的模板。它们用于管理SharePoint进程中的文档流。创建了这类项目后,就可以在文档的生存期中,在重要的时刻执行定制代码。4. InfoPath窗体模板这是用于InfoPath窗体的文档级定制的一种形式,但它们给Word和Excel文档定制使用略微不同的方法,所以通常要分为不同的类别。可以为InfoPath窗体创建模板,扩展InfoPath设计器的功能,为InfoPath窗体的设计人员和终端用户提供额外的功能和业务逻辑。创建InfoPath窗体模板时,可以利用向导指定要创建的项目类型,如图40-4所示。图 40-4在图40-4中,这个向导为所创建的窗体提供了很大的灵活性:可以选择许多不同的起点(包括SharePoint站点上的窗体)。还可以创建完整的窗体或模板部分,把功能限制为与浏览器兼容的功能。40.1.2 项目特性在各种VSTO项目类型中有几个可以使用的特性,例如交互面板和控件。我们使用的项目类型决定了可用的特性。表40-1根据项目类型列出了这些特性。表 40-1特 性说 明动作面板动作面板是保存在Word或Excel的动作面板中的对话框。可以在这里显示任意控件,这是扩展文档和应用程序的一种万能方式数据高速缓存数据的高速缓存可以在文档外部的高速缓存数据孤岛上存储在文档中使用的数据。这些数据孤岛可以从数据源中更新或手工更新,在数据源脱机或不可用时,允许Office文档访问数据VBA代码的端点如前所述,VSTO支持与VBA的交互操作。在文档级的定制中,可以提供从VBA代码中调用的端点方法主机控件主机控件是Office对象模型中已有控件的扩展封装器。可以操作这些对象,与它们建立数据绑定智能标记智能标记是嵌入在Office文档中、有类型化内容的对象。它们在Office文档的内容中自动检测,例如,应用程序检测到相应的文本时,就会自动添加股票报价智能标记。可以创建自己的智能标记类型,定义可以在该标记上执行的操作可视化文档设计器处理文档定制项目时,要使用Office对象模型创建一个可视化的设计界面,以交互式地布置控件。设计器中显示的工具栏和菜单(如本章后面所述)具有全面的功能应用程序级的插件特性特 性说 明定制任务面板任务面板一般位于Office应用程序的一个边界上,提供了各种功能。例如,Word的一个任务面板用于操作样式。与动作面板一样,它们也提供了很大的灵活性跨应用程序的通信为某个Office应用程序创建了插件后,就可以把这个功能提供给其他插件。例如可以在Excel中创建一个财务计算服务,再在Word中使用该服务无需创建一个单独的插件Outlook窗体区域可以创建在Outlook中使用的窗体区域所有项目类型可用的特性特 性说 明ClickOnce部署可以通过ClickOnce部署方法把自己创建的任意VSTO项目发布给终端用户,让用户检测对应用程序的程序集清单的变化,拥有文档级和应用程序级解决方案的最新版本Ribbon菜单Ribbon菜单在所有的Office应用程序中使用。VSTO提供了创建定制ribbon菜单的两种方式,可以使用XML定义ribbon,也可以使用Ribbon设计器,后者更容易使用,但采用XML版本可以保证向后兼容性40.2 VSTO基础知道了VSTO包含的内容,下面该看看VSTO的特殊一面了,并学习如何建立VSTO项目。本节介绍的技术可以应用于所有的VSTO项目类型。本节介绍如下内容: Office对象模型 VSTO命名空间 主机项和主机控件 基本VSTO项目结构 Globals类 事件处理40.2.1 Office对象模型Office应用程序的2007套装通过一个COM对象模型提供其功能。可以在VBA中直接使用这个对象模型,来控制Office功能的任意方面。Office对象模型在Office 97中引入,之后有了许多演变,Office中的功能也有许多改变。Office对象模型有数量巨大的类,其中一些类在Office应用程序的套装中使用,一些类专门用于某些应用程序。例如,Word 2007对象模型包含Documents集合,它表示当前加载的对象,每个对象都用一个Document对象表示。在VBA代码中,可以根据名称或索引访问文档,调用方法对它们执行操作。例如,下面的VBA代码关闭了名称为My Document的文档,且不保存修改的内容:Documents(My Document).Close SaveChanges:=wdDoNotSaveChangesOffice对象模型包含命名的常量(例如上面代码中的wdDoNotSaveChanges)和枚举,更便于使用。40.2.2 VSTO命名空间VSTO包含一个命名空间集合,该集合包含的类型可用于给Office对象模型编写程序。这些命名空间中的许多类和枚举直接映射到Office对象模型中的对象和枚举上。它们可以通过Office PIAs访问。VSTO还包含不能直接映射的类型,或者与Office对象模型无关的类型。例如,有许多类用于Visual Studio中支持的设计器。封装了Office对象模型中的对象或与它们通信的类型分别放在不同的命名空间中,这些命名空间包含了用于Office 2003和2007的类型。用于Office 2007开发的命名空间如表40-2所示。表 40-2命 名 空 间说 明Microsoft.Office.CoreMicrosoft.Office.Interop.*这些命名空间包含PIA类的瘦封装器,所以提供了处理Office类的基本功能。在Microsoft.Office.Interop命名空间中有几个嵌套的命名空间,用于每个Office产品Microsoft.Office.Tools这个命名空间包含的基本类型提供了VSTO功能和用于嵌套命名空间中的许多类的基类。例如,这个命名空间包含了实现文档级定制中的动作面板所需的类,以及应用程序级插件的基类Microsoft.Office.Tools.ExcelMicrosoft.Office.Tools.Excel.*这些命名空间包含的类型用于与Excel应用程序和Excel文档交互Microsoft.Office.Tools.Outlook这个命名空间包含的类型用于与Outlook应用程序交互Microsoft.Office.Tools.Ribbon这个命名空间包含的类型用于处理和创建Ribbon菜单Microsoft.Office.Tools.WordMicrosoft.Office.Tools.Word.*这些命名空间包含的类型用于与Word应用程序和Word文档交互Microsoft.VisualStudio.Tools.*这些命名空间提供的VSTO基础体系可以在Visual Studio中开发VSTO解决方案时使用40.2.3 主机项和主机控件主机项和主机控件是扩展文档级定制的类,使之更容易与Office文档交互。这些类简化了代码,因为它们提供了.NET样式的事件,且进行了全面的管理。主机项和主机控件中的主机表示,这些类封装和扩展了通过PIAs访问的内部Office对象。在使用主机项和主机控件时,常常需要使用底层的PIA交互操作类型。例如,如果创建了一个新的Word文档,就会接收到对交互操作Word文档类型的引用,而不是Word文档主机项。必须注意这一点,并据此编写代码。Word和Excel文档级定制都有主机项和主机控件。1. WordWord只有一个主机项Microsoft.Office.Tools.Word.Document。这表示一个Word文档。这个类有许多方法和属性,可用于与Word文档交互。Word有12个主机控件,如表40-3所示,所有主机控件都在Microsoft.Office.Tools.Word命名空间中。表 40-3控 件说 明Bookmark这个控件表示Word文档中的一个位置,它可以是单个位置,或一个字符范围XMLNode, XMLNodes文档有一个关联的XML模式时使用这两个控件,它们允许通过文档内容的XML节点位置来引用文档内容。也可以用这两个控件操作文档的XML结构ContentControl这个类是本表中剩余8个控件的基类,允许处理Word内容控件。内容控件把内容表示为控件,或者启动文档中纯文本没有的功能BuildingBlockGallery-ContentControl这个控件允许添加和处理文档构造块,例如格式化的表、封面等ComboBoxContentControl这个控件表示格式化为组合框的内容DatePickerContentControl这个控件表示格式化为日期提取器的内容DropDownListContentControl这个控件表示格式化为下拉列表的内容GroupContentControl这个控件表示的内容是其他内容项的组合集合,包括文本和其他内容控件PictureContentControl这个控件表示一个图像RickTextContentControl这个控件表示一大块文本内容PlainTextContentControl这个控件表示一大块纯文本内容2. ExcelExcel有3个主机项和4个主机控件,它们都包含在Microsoft.Office.Tools.Excel命名空间中。Excel主机项如表40-4所示。表 40-4主 机 项说 明Workbook这个主机项表示整个Excel工作簿,它可以包含多个工作表和图表Worksheet这个主机项用于工作簿中的单个工作表Chartsheet这个主机项用于工作簿中的单个图表Excel主机控件如表40-5所示。表 40-5控 件说 明Chart这个控件表示嵌入到工作表中的图表ListObject这个控件表示工作表中的一个列表NamedRange这个控件表示工作表中的一个命名区域XmlMappedRange这个控件在Excel电子表格有关联的模式时使用,用于处理映射到XML模式元素上的范围40.2.4 基本的VSTO项目结构第一次创建VSTO项目时,系统创建的文件随项目类型的不同而不同,但有一些共同的特性。本节介绍VSTO项目的组成。1. 文档级定制的项目结构创建文档级定制的项目时,在Solution Explorer中有一项表示文档类型。它可以是: 表示Word文档的.docx文件 表示Word模板的.dotx文件 表示Excel工作簿的.xlsx文件 表示Excel模板的.xltx文件每个文档类型都有一个设计器视图和一个代码文件,如果在Solution Explorer中展开该项,就会看到它们。Excel模板还包含子项,它们表示整个工作簿和工作簿中的每个工作表。这个结构可以在每个工作表或工作簿的基础上提供定制功能。如果查看上述项目类型的隐藏文件,会看到几个设计器文件,查看这些设计器文件,还会看到模板生成的代码。每个Office文档项都在VSTO命名空间中有关联的类,代码文件中的类派生于这些类。这些类定义为部分类,这样定制代码会与可视化设计器生成的代码分隔开,类似于Windows窗体应用程序的结构。例如,Word文档模板提供了一个派生自主机项Microsoft.Office.Tools.Word.Document的类,其代码包含在ThisDocument.cs中,如下所示:using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text;using System.Windows.Forms;using System.Xml.Linq;using Microsoft.VisualStudio.Tools.Applications.Runtime;using Office = Microsoft.Office.Core;using Word = Microsoft.Office.Interop.Word;namespace WordDocument1public partial class ThisDocumentprivate void ThisDocument_Startup(object sender, System.EventArgs e)private void ThisDocument_Shutdown(object sender, System.EventArgs e)#region VSTO Designer generated code/ / Required method for Designer support - do not modify/ the contents of this method with the code editor./ private void InternalStartup()this.Startup += new System.EventHandler(ThisDocument_Startup);this.Shutdown += new System.EventHandler(ThisDocument_Shutdown);#endregion这些模板生成的代码包含两个主要命名空间的别名,在为Word创建文档级的定制时,需要使用这两个命名空间。Microsoft.Office.Core用于主要的VSTO Office类,Microsoft.Office.Interop.Word用于和Word相关的类。注意如果要使用Word主机控件,还要为Microsoft.Office.Tools.Word命名空间添加一个using语句。模板生成的代码还定义了两个事件处理程序ThisDocument_Startup()和ThisDocument_Shutdown(),用于在加载和卸载文档时执行代码。每个文档级定制项目类型的代码文件都有类似的结构,还定义了命名空间别名以及VSTO类中各个Startup和Shutdown事件的处理程序。以此为起点,可以添加对话框、动作面板、ribbon控件、事件处理程序和定制代码,来定义定制操作。在文档级的定制中,还可以通过文档设计器定制文档。根据所创建的解决方案类型,这可能需要给模板添加样板文件,给文档添加交互式内容或其他内容。设计器是Office应用程序的高效主机版本,使用它们可以像在应用程序中那样输入内容。还可以在文档中添加控件,例如主机控件和Windows窗体控件,以及这些控件的代码。2. 应用程序级插件的项目结构创建应用程序级插件时,在Solution Explorer中没有文档,而有一项表示创建插件所使用的应用程序。如果展开该项,会看到一个文件ThisAddIn.cs。这个文件包含类ThisAddIn的部分定义,该类是插件的入口点。这个类派生于Microsoft.Office.Tools.AddIn,它提供了编写插件的功能,实现了Microsoft.VisualStudio.Tools.Office.IOfficeEntryPoint接口,这是一个基础体系接口。例如,Word插件模板生成的代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml.Linq;using Word = Microsoft.Office.Interop.Word;using Office = Microsoft.Office.Core;namespace WordAddIn1public partial class ThisAddInprivate void ThisAddIn_Startup(object sender, System.EventArgs e)private void ThisAddIn_Shutdown(object sender, System.EventArgs e)#region VSTO generated code/ / Required method for Designer support - do not modify/ the contents of this method with the code editor./ private void InternalStartup()this.Startup += new System.EventHandler(ThisAddIn_Startup);this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);#endregion可以看出,这个结构非常类似于文档级定制使用的结构,它包含Microsoft.Office.Core和Microsoft.Office.Interop.Word命名空间的别名,提供了Startup和Shutdown事件的处理程序(ThisAddIn_Startup()和ThisAddIn_Shutdown()。这些事件与文档级定制略有不同,因为它们在加载或卸载插件时触发,而不是在打开或关闭文档时触发。定制应用程序级插件与文档级定制相同:添加ribbon控件、任务面板和其他代码。40.2.5 Globals类所有的VSTO项目类型都定义了Globals类,它提供了如下内容的全局访问权限: 对于文档级的定制,可以访问解决方案中的所有文档,这是通过其名称匹配文档类名的成员来实现的,例如Globals.ThisWorkbook和Globals.Sheet1。 对于应用程序级的插件,可以访问插件对象。这是通过Globals.ThisAddIn实现的。 对于Outlook插件项目,可以访问所有的Outlook窗体区域。 可以访问解决方案中的所有ribbon控件,这是通过Globals.Ribbons属性定义的。在后台,Globals类是在解决方案的由各种设计器维护的代码文件中通过一系列部分定义来创建的。例如,在Excel工作簿项目中,默认的Sheet1工作表包含如下设计器生成的代码:internal sealed partial class Globalsprivate static Sheet1 _Sheet1;internal static Sheet1 Sheet1getreturn _Sheet1;setif (_Sheet1 = null)_Sheet1 = value;elsethrow new System.NotSupportedException();这段代码把Sheet1成员添加到Globals类中。40.2.6 事件处理本章前面介绍了主机项和主机控件类如何提供我们可以处理的事件。但交互操作类不是这样。我们只能使用几个事件,大多数事件都很难用于创建事件驱动的解决方案。为了响应事件,我们常常要关注主机项和主机控件提供的事件。此处一个明显的问题是应用程序级的插件项目没有主机项和主机控件。在使用VSTO时,必须面对这个问题。但是,我们在插件中监听的大多数常用事件都关联到ribbon菜单和任务面板的交互操作中。我们用集成的ribbon设计器设计ribbon控件,响应ribbon控件生成的事件,使控件可以交互操作。任务面板常常实现为Windows窗体用户控件(也可以使用WPF),所以这里可以使用Windows窗体事件,来代替PIA交互操作事件。这表示,我们不会常常遇到如下情形:需要的功能没有可用的事件。需要使用PIA提供的事件时,这些事件是通过PIA对象上的接口提供的。考虑一个Word插件项目。这个项目中的ThisAddIn类有一个属性Application,利用它可以获得对Office应用程序的引用。这个属性的类型是Microsoft.Office.Interop.Word.Application,它通过Microsoft.Office.Interop.Word.ApplicationEvents4_Event接口提供事件。这个接口共提供了29个事件(对于像Word这样复杂的应用程序来说并不多)。我们可以处理DocumentBeforeClose事件,来响应Word文档的关闭请求。40.3 建立VSTO解决方案前面几节解释了VSTO项目的概念、结构和可以在各种项目类型中使用的特性。本节讨论如何实现VSTO解决方案。图40-5列出了文档级定制解决方案的结构。对于文档级的定制,至少要与一个主机项交互操作,该主机项一般包含几个主机控件。可以直接使用Office对象封装器,但在大多数情况下,应通过主机项和主机控件访问Office对象模型及其功能。图 40-5可以在代码中使用主机项和主机控件事件、数据绑定、ribbon菜单、动作面板和全局对象。图40-6列出了应用程序级插件解决方案的结构。图 40-6在这个略微简单的模型中,很可能要直接使用Office对象的瘦封装器,或者至少通过封装解决方案的插件类来使用。还要在代码中使用插件类的事件、ribbon菜单、动作面板和全局对象。本节介绍这两种应用程序类型以及如下主题: 管理应用程序级插件 与应用程序和文档交互操作 UI的定制40.3.1 管理应用程序级插件在创建应用程序级插件时,会发现Visual Studio执行了注册Office应用程序的插件所需的所有步骤。这表示,添加了注册表项,在Office应用程序启动时,会自动定位和加载程序集。如果以后要添加或删除插件,就必须浏览Office应用程序设置,或者手工操作注册表。例如,在Word中,必须打开Office Button菜单,单击Word Options,选择Add-Ins选项卡,如图40-7所示。图 40-7图40-7显示,用VSTO创建了两个插件:WordAddIn1和WordDocEditTimer。要添加或删除插件,必须在Manage下拉列表中选择COM Add-Ins(默认选项),单击Go按钮,打开如图40-8所示的对话框。图 40-8 在COM Add-Ins对话框中取消对插件的选择,就会卸载插件,如图40-8所示。还可以使用Add和Remove按钮添加新插件或删除旧插件。40.3.2 与应用程序和文档交互操作无论创建什么类型的应用程序,都要与主机应用程序和/或主机应用程序中的文档交互操作。这包括使用下一节介绍的UI定制功能。还可能需要监控应用程序中的文档,这表示必须处理一些Office对象模型事件。例如,要监控Word中的文档,需要Microsoft.Office. Interop.Word.ApplicationEvents4_Event接口中如下事件的处理程序: DocumentOpen:打开文档时触发 NewDocument:创建新文档时触发 DocumentBeforeClose:保存文档时触发另外,Word第一次启动时,会加载一个文档,它可以是空白的新文档,也可以是已加载的旧文档。提示:本章的下载代码包含一个示例WordDocEditTimer,它维护着Word文档的一个编辑时次数表。这个应用程序的部分功能是监控已加载的文档,其原因在后面解释。这个示例也使用了定制的任务面板和ribbon菜单,所以在介绍完这些主题后,再介绍这个示例。在Word中,可以通过ThisAddIn.Application.ActivateDocument属性访问当前活动的文档,通过ThisAddIn.Application.Documents属性访问打开的文档集合。由于有了Multiple Document Interface(MDI),类似的属性也存在于其他Office应用程序中。可以通过Microsoft.Office.Interop.Word.Document类的属性操作文档的各个属性。这里要注意,在开发VSTO解决方案时,必须处理的类和类成员的数量是相当大的。除非已经习惯了,否则很难找到需要的特性。例如,在Word中,当前活动的选择不是通过活动的文档获得的,而是通过应用程序获得的(利用ThisAddIn.Application.Selection属性)。其原因并不是很明显。通过Range属性可以把选择应用于插入、读取或替换文本的操作。例如:ThisAddIn.Application.Selection.Range.Text = Inserted text;但是,本章没有足够的篇幅来详细介绍对象库,读者可以在本章讨论到相关的内容时学习对象库。40.3.3 UI的定制在VSTO的最新版本中,最重要的方面是定制UI的功能和插件的灵活性。可以给已有的ribbon菜单中添加内容,添加全新的ribbon菜单,定制动作面板,添加全新的动作面板,集成Windows窗体、WPF窗体和控件。本节介绍这些主题。1. Ribbon菜单可以在本章介绍的所有VSTO项目中添加ribbon菜单。添加ribbon菜单时,会看到如图40-9所示的设计器窗口。图 40-9设计器可以给Office按钮菜单和ribbon菜单上的组添加控件(显示在图40-9的左上部),来定制这个ribbon菜单。也可以添加其他组。ribbon中使用的类在Microsoft.Office.Tools.Ribbon命名空间中。这包括用于创建ribbon的派生类OfficeRibbon。这个类可以包含RibbonTab对象,每个RibbonTab对象都包含了单个选项卡的内容。选项卡则包含了RibbonGroup对象,例如图40-9中的group1组。这些选项卡都可以包含各种控件。选项卡上的组可以位于目标Office应用程序的一个全新选项卡上,或者位于一个已有的选项卡上。组在何处显示取决于RibbonTab.ControlId属性。这个属性有一个ControlIdType属性,它可以设置为RibbonControlIdType.Custom或RibbonControlIdType.Office。如果使用Custom,还必须把RibbonTab.ControlId.CustomId设置为String值,这是选项卡的标识符。这里可以使用任意标识符。但如果给ControlIdType使用Office,就必须把RibbonTab.ControlId.OfficeId设置为一个String值,该值匹配在当前Office产品中使用的一个标识符。例如,在Excel中,可以把这个属性设置为TabHome,把组添加到Home选项卡上,设置为TabInsert把组添加到Insert选项卡上,等。插件的默认属性是TabAddIns,它由所有的插件共享。提示:可以使用许多选项卡,尤其在Outlook中;可以从/downloads/ details.aspx?FamilyID=4329D9E9-4D11-46A5-898D-23E4F331E9AE&displaylang=en中下载包含完整列表的一系列电子表格。决定了在何处放置ribbon组后,就可以添加如表40-6所示的控件了。表 40-6控 件说 明RibbonBox这是一个容器控件,可用于布置组中的其他控件。可以把BoxStyle属性改为RibbonBoxStyle.Horizontal或RibbonBoxStyle.Vertical,在RibbonBox中水平或垂直布置控件RibbonButton这个控件可用于在组中添加大按钮或小按钮,在按钮的旁边可以有或没有文本标签。把ControlSize属性设置为RibbonControlSize. RibbonControlSizeLarge或RibbonControlSize. RibbonControlSizeRegular,就可以控制大小。按钮的Click事件处理程序可用于响应交互操作。还可以设置定制图像或存储在Office系统中的图像(详见本表后面的内容)RibbonButtonGroup这是一个容器控件,表示一组按钮。它可以包含RibbonButton、RibbonGallery、RibbonMenu、RibbonSplitButton和RibbonToggleButton控件RibbonCheckBox复选框控件,有Click事件和Checked属性RibbonComboBox组合框(合并了文本项和下拉列表)。列表项使用Items属性,输入的文本使用Text属性,TextChanged事件用于响应交互操作RibbonDropDown这个容器可以包含RibbonDropDownItem和RibbonButton项,它们分别在Items和Buttons属性中指定。按钮和列表项格式化到下拉列表中。使用SelectionChanged事件响应交互操作(续表) 控 件说 明RibbonEditBox文本框,用户可用于输入或编辑Text属性中的文本。这个控件有TextChanged事件RibbonGallery与RibbonDropDown相同,这个控件也可以包含RibbonDropDownItem和RibbonButton项,它们分别在Items和Buttons属性中指定。这个控件使用Click和ButtonClick事件,来替代RibbonDropDown 控件的SelectionChanged事件RibbonLabel显示简单的文本,用Label属性设置RibbonMenu弹出菜单,在设计视图中打开时,可以用其他控件填充该菜单,例如RibbonButton和嵌套的RibbonMenu控件。处理菜单上的菜单项的事件RibbonSeparator一个简单的分隔符,用于定制组中的控件布局RibbonSplitButton合并了RibbonButton或RibbonToggleButton和RibbonMenu的控件。用ButtonType设置按钮的样式,该属性可以是RibbonButtonType. Button或RibbonButtonType. ToggleButton。使用主按钮的Click事件或菜单中各按钮的Click事件来响应交互操作RibbonToggleButton一个按钮,可以处于选中或未选中状态,用Checked属性指定。这个控件也有Click事件也可以设置组的DialogBoxLauncher属性,把一个图标显示在组的右下部。使用这个属性可以显示一个对话框,或者打开一个任务面板,或者执行其他操作。通过GroupView Tasks菜单可以添加或删除这个图标,如图40-10所示,该图还显示了表40-5中的其他一些控件,因为它们在设计视图中显示在ribbon上。图 40-10 要给控件设置图像,例如给RibbonButton控件设置图像,就可以把Image属性设置为定制图像,ImageName设置为图像名(以便在OfficeRibbon.LoadImage事件处理程序中优化图像的加载),也可以使用内置的Office图像。为此,应把OfficeImageId属性设置为图像的ID。可以使用许多图像;还可以从/downloads/details.aspx?familyid =12b99325-93e8-4ed4-8385-74d0f7661318&displaylang=en上下载包含这些图像的电子表格。图40-11显示了一个示例。图 40-11提示:图40-11显示了Developer ribbon选项卡,通过Popular选项卡上的Excel Options对话框中的Office按钮可以打开它。单击一个图像,就会打开一个对话框,指出该图像的ID是什么,如图40-12所示。图 40-12ribbon设计器非常灵活,还可以提供希望出现在Office ribbon上的许多额外功能。但是,如果要进一步定制UI,就要使用动作和任务面板,因为可以通过它们创建任意UI和功能。2. 动作面板和定制的任务面板使用动作和任务面板可以显示停放在Office应用程序界面的任务面板区域中的内容。任务面板在应用程序级的插件中使用,动作面板在文档级的定制中使用。任务和动作面板都必须继承自UserControl对象,这表示应使用Windows窗体创建一个UI。如果把WPF窗体保存在UserControl的ElementHost控件上,还可以使用WPF UI。这些控件的一个区别是可以通过New Item Wizard中的Action Pane Template,或使用简单的用户控件,把动作面板添加到文档级的定制上。任务面板必须添加为一般的用户控件。要把动作面板添加到文档级定制中的一个文档上,应把动作面板类的一个实例添加到文档的ActionsPane属性的Controls集合中。例如:public partial class ThisWorkbookPrivate ActionsPaneControl1 actionsPane;private void ThisWorkbook_Startup(object sender, System.EventArgs e)actionsPane = new ActionsPaneControl1();this.ActionsPane.Controls.Add(actionsPane);.这段代码在加载文档(这里是Excel工作簿)时添加了动作面板。也可以在ribbon按钮事件处理程序中添加动作面板。在应用程序级插件项目中,定制的任务面板通过ThisAddIns.CustomTaskPanes.Add()方法属性添加。这个方法也允许命名任务窗口,例如:public partial class ThisAddInMicrosoft.Office.Tools.CustomTaskPane taskPane;private void ThisAddIn_Startup(object sender, System.EventArgs e)taskPane = this.CustomTaskPanes.Add(new UserControl1(), My Task Pane);taskPane.Visible = true;.注意Add()方法返回一个Microsoft.Office.Tools.CustomTaskPane类型的对象。可以通过这个对象的Control属性访问用户控件本身。还可以使用这个类型的其他属性,例如上面代码中的Visible属性,来控制任务面板。此时,应注意Office应用程序的一个不太寻常的特性,尤其是Word和Excel之间的区别。由于历史的原因,尽管Word和Excel都是MDI应用程序,但这两个应用程序存储文档的方式是不同的。在Word中,每个文档都有一个唯一的父窗口,而在Excel中,每个文档都共享同一个父窗口。在调用CustomTaskPanes.Add()方法时,默认操作是把任务面板添加到当前活动的窗口中。在Excel中,这表示每个文档都显示该任务面板。因为它们都使用同一个父窗口。而在Word中,情况就不同了。如果希望任务面板显示给每个文档,就必须把它添加到包含文档的每个窗口中。要把任务面板添加到特定的文档中,应给Add()方法传送Microsoft.Office.Interop. Word.Windows类的一个实例,作为第三个参数。通过Microsoft.Office.Interop.Word. Document.ActiveWindow属性可以获得关联了文档的窗口。下一节介绍如何完成这个操作。40.4 示例应用程序如前所述,本章的示例代码包含一个应用程序WordDocEditTimer,它维护着Word文档的一个编辑次数列表。本节将详细解释这个应用程序的代码,因为该应用程序演示了前面介绍的所有内容,还包含一些有益的提示。这个应用程序的一般操作是只要创建或加载了文档,就启动一个链接到文档名称上的计时器。如果关闭文档,该文档的计时器就暂停。如果打开了以前计时的文档,计时器就恢复。另外,如果使用Save As把文档保存为另一个文件名,计时器就更新为使用新文件名。这个应
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023公路水运工程试验检测人员考试习题及答案
- 安国市2025-2026学年八年级上学期语文期中模拟试卷
- 安徽省滁州市全椒县2023-2024学年高三上学期第二次月考历史试题及答案
- 江苏省江阴市2025-2026学年八年级上学期开学考试数学试题答案
- 河南省驻马店市汝南县2024-2025学年四年级下学期期末英语试题
- 2024-2025学年山东省淄博市周村区七年级(下)期末数学试卷(五四学制)(含答案)
- 地摊仓库出租合同范本
- 运动教练聘用合同范本
- 供暖施工付款合同范本
- 湖南建工工程合同范本
- 2025年电抗器行业当前市场规模及未来五到十年发展趋势报告
- 新班主任自我介绍课件
- 2025年副高卫生职称-公共卫生类-妇女保健(副高)代码:093历年参考题库含答案解析(5卷)
- 2025广西中考英语真题(原卷版)
- 餐饮行业食品安全管理实务培训教材
- 反歧视艾滋病课件
- 医疗放射安全知识培训课件
- 2025年南京保安考试题库
- 2025年广东省中考历史试卷(含答案)
- 基孔肯雅热防控技术指南2025版培训课件
- 毛衫各部位基本尺寸测量表示法中英文对照适用毛织厂
评论
0/150
提交评论