2007 Office Fluent Ribbon定制用户指南(连载8)

使用COM加载项修改Fluent UI
可以使用COM加载项来修改Fluent UI。当确定创建一个合并Ribbon定制和使用可管理代码的COM加载项时,有两种不同的选择。可以使用Visual Studio 2005提供的共享外接程序模板,创建一个标准的共享加载项。或者,如果已安装了Visual Studio 2005 Tools for Office Second Edition,可以更好地创建COM加载项。
通过Visual Studio 2005 Tools for Office Second Edition创建的加载项可以运行在单独的宿主应用程序中,并且这些加载项的编程模型更简单、更易维护。
一、使用共享的外接程序修改Fluent UI
下面的示例使用一个可管理的COM加载项在Word 2007中添加自定义UI。该加载项创建一个自定义选项卡、一个组和一个按钮,当单击该按钮时,加载项在光标的位置插入一个公司名称。
1、创建加载项解决方案
(1) 开启Visual Studio 2005。
(2) 在“文件”菜单中,打开“新建项目”。
(3) 在“新建项目”对话框中,在“项目类型”窗口,打开“其他项目类型”节点,单击“扩展性”,然后选择“共享的外接程序”。
(4) 在名称框中,输入InsertCompanyAddIn,然后单击“确定”来创建项目。
(5) 在“共享外接程序向导”的第一页,单击“下一步”。
(6) 在“选择编程语言”页,选择Visual C#或Visual Basic,然后单击“下一步”。
(7) 在“选择应用程序主机”页,清除除Microsoft Word外的所有选择,然后单击“下一步”。
(8) 在“输入名称和说明”页,在名称框中输入“InsertCompanyAddIn”,在描述框中输入“Insert Company Name”,然后单击“下一步”。
(9) 在“选择外接程序选项”页,选择“我希望在加载宿主程序的同时加载我的外接程序”,然后单击“下一步”,然后单击“完成”。
Visual Studio创建一个新的解决方案,包含两个工程——加载项本身和一个安装项目(安装项目能使您在其它用户的计算机中安装该加载项,并且使得在设计时更容易安装和卸载该加载项。)
为了与Word 2007和Ribbon对象模型相交互,添加对两类库的引用。
2、添加引用
(1) 在解决方案管理器中,展开“引用”文件夹。
如果没有看到“引用”文件夹,在“项目”菜单中,单击“显示所有文件”。
(2) 删除Microsoft.Office.Core引用。
(3) 右键单击“引用”文件夹,然后单击“添加引用”。
(4) 单击“COM”选项卡,选择“Microsoft Office 12.0 Object Library”,然后单击“确定”。
(5) 在打开的代码文件顶部,添加下面的语句到工程中。
Imports Microsoft.Office.Core
Imports Word = Microsoft.Office.Interop.Word
3、创建一个XML定制文件
(1) 在“项目”菜单中,单击“添加新项”。
(2) 在“添加新项”对话框中,选择“XML文件”,命名新的文件为Ribbon.xml,然后单击“添加”按钮。
(3) 在新的XML文件中,添加下面的XML标记。
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
  <ribbon>
    <tabs>
      <tab id=”CustomTab” label=”My Tab”>
        <group id=”SampleGroup” label=”Sample Group”>
          <button id=”Button” label=”Insert Company Name”
            size=”large” onAction=”InsertCompanyName” />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
(4) 保存和关闭该文件。
如果将XML文件当作项目资源文件里的一段资源,则使用该XML文件更容易。
4、创建XML资源
(1) 在解决方案管理器中,选择Ribbon.xml。
(2) 在属性窗口,选择“生成操作”属性,然后在选项列表中选择“嵌入的资源”。
(3) 在“项目”菜单中,单击“InsertCompanyAddIn属性”。
(4) 在“资源”选项卡。
(5) 在“解决方案管理器”中,拖放Ribbon.xml到资源设计面中。
这项操作创建一个新的基于文件的资源,包含XML内容。现在,Ribbon.xml文件作为应用程序资源自动存储,并且通过使用Visual Basic或Visual C#语言功能获取该内容。
(6) 关闭资源窗口。当出现提示时,单击“是”来保存这些资源。
5、访问宿主应用程序并处理Ribbon
(1) 在解决方案管理器中,右键单击“Connect.cs”或“Connect.vb”,然后单击“查看代码”。
(2) 找到已存在的applicationObject变量声明,对其进行修改以引用Word.Application对象。即修改该声明如下面的代码所示。
Private applicationObject As Word.Application
(3) 修改OnConnection方法中已存的的第一行,创建Word.Application对象的一个实例。
applicationObject = DirectCast(application, Word.Application)
(4) (对Visual Basic)修改类顶部以Implements开始的代码行,添加对实现IRibbonExtensibility命名空间的支持。Visual Basic自动地插入GetCustomUI过程。
Implements Extensibility.IDTExtensibility2, IRibbonExtensibility
(5) (对C#)在public class Connect:语句的结尾处,添加一个逗号,然后输入下面的接口名称。
IRibbonExtensibility
(6) (对C#)右键单击刚添加的接口,单击“实现接口”,然后单击“显式实现接口”,这将添加唯一的IRibbonExtensibility接口成员:GetCustomUI。
(7) 修改GetCustomUI方法,其代码如下所示。
Public Function GetCustomUI(ByVal RibbonID As String) As String _
  Implements Microsoft.Office.Core.IRibbonExtensibility.GetCustomUI
  Return My.Resources.Ribbon
End Function

注意:GetCustom应该被执行来返回Ribbon定制的XML字符串,不应该用于初始化。特别地,不应该企图显示任何对话框或消息窗体在GetCustomUI执行中。初始化更合适的地方在OnConnection方法(为共享的外接程序)或ThisAddIn_Startup方法(使用Visual Studio 2005 for Office Second Edition创建)。
(8) 在类中添加下面的方法,该方法插入公司名称到当前光标所在位置的文档中。
Public Sub InsertCompanyName(ByVal control As Office.IRibbonControl)
  ‘ Inserts the specified text at the current location
  ‘ in the document.
  Dim companyName As String = “Microsoft Corporation”
  applicationObject.Selection.InsertAfter (companyName)
End Sub
(9) 在“文件”菜单中,单击“全部保存”。
(10) 如果正在运行则退出Word 2007。
(11) 在“生成”菜单中,单击“生成解决方案”。
(12) 在解决方案管理器中,右键单击“InsertCompanyAddInSetup”,然后单击“生成”。
(13) 右键单击“InsertCompanyAddInSetup”,然后单击“安装”。出现“InsertCompanyAddIn安装向导”。
(14) 单击每页中的“下一步”,然后在最后屏幕中单击“关闭”。
(15) 开启Word。此时,“My Tab”选项卡出现在其它选项卡的右侧。
(16) 单击“My Tab”,然后单击“Insert Company Name”。Word在文档光标位置处插入指定的公司名称。
(17) 退出Word。
(18) 在Visual Studio的“解决方案管理器”中,右键单击“InsertCompanyAddInSetup”,然后单击“卸载”。
二、使用Visual Studio 2005 Tools for Office Second Edition工程修改Fluent UI
下面的示例介绍如何创建与前面示例相同的加载项,但这次使用Visual Studio 2005 Tools for Office Second Edition。
1、创建项目
(1) 开启VSTO。
(2) 在“文件”菜单中,选择“新建项目”。
(3) 在“新建项目”对话框,选择Visual Basic或Visual C#。
(4) 在“项目类型”窗格,展开Office节点,选择“2007外接程序”。
(5) 在“模板”窗格,选择“Word外接程序”。
(6) 在名称框中输入“InsertCompanyAddIn1”,然后单击“确定”创建新的加载项。
Visual Studio创建了一个的解决方案,包含两个项目:加载项自身和安装项目。(安装项目能够在其它用户的计算机上安装加载项,并且使得在设计时安装和卸载加载项更容易。)
注意,虽然新加载项实现IExtensibility2接口,但不会看到该接口所需要的过程。相反VSTO创建名为ThisAddIn的简单的类,提供可能需要的过程。可以在ThisAddIn_Startup方法或ThisAddIn_Shutdown方法中添加代码。对于本例,不需要在这些方法中添加代码,也不需要修改代码或设置引用来创建加载项,所有的连接工作都已经完成了。
2、添加Ribbon扩展项
(1) 在“项目”菜单中,单击“添加新项”。
(2) 在“添加新项”对话框中,选择“功能区支持”。
(3) 接受缺省名称(Ribbon1.vb或Ribbon1.cs),单击“添加”按钮。
该模板添加一个名为Ribbon1.xml的XML文件,以及在工程中添加了一个新类。该XML文件包含一个非常简单的自定义UI。这个新Ribbon1文件包含ThisAddIn类的可以注释掉的扩展,以及一个名为Ribbon1的新类。
(4) 在解决方案管理器中,双击Ribbon1.xml,在XML编辑器中打开该文件。
(5) 如下所示修改这个已存在的XML。
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui” onLoad=”OnLoad”>
  <ribbon>
    <tabs>
      <tab id=”CustomTab” label=”My Tools Tab”>
        <group id=”SampleGroup” label=”Sample Group”>
          <button id=”Button” label=”Insert Company Name”
            size=”large” onAction=”InsertCompanyName” />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
(6) 保存该XML文件并关闭XML编辑器。
如果将该XML文件当作项目的资源文件里的一个资源,则最容易使用该文件。
3、创建XML资源
(1) 在“项目”菜单中,单击“InsertCompanyAddIn1属性”。
(2) 单击“资源”选项卡。
(3) 在解决方案管理器中,拖放Ribbon1.xml到资源设计面板中。
该操作创建了一个新的基于文件的资源,包含XML内容。现在,Ribbon1.xml文件自动作为一个应用程序资源存储,并且可以通过使用Visual Basic或Visual C#语言功能获取该内容。
(4)关闭资源窗口,当出现提示时,单击“是”保存资源。
4、修改Ribbon代码并完成该加载项
(1) 在解决方案管理器中,右键单击Ribbon1.vb或Ribbon1.cs,然后单击“查看代码”。
(2)  在代码编辑器中,选择名为ThisAddIn的局部类,并取消该类的注释。
RequestService过程启用VSTO运行,确定处理加载项的Ribbon定制的回调。如果这个过程被传递GUID与IRibbonExtensibility接口一致,如果有则返回其IRibbonUI实例,如果没有,则传递控件到其基础类的RequestService方法。
注:缺省情况下,RequestService方法出现在注释中,因为加载项可能已包括了该方法的重载(可能为FromRegionStartup接口,或者其它新的可扩展接口。)如果是这种情况,则可以从注释的代码中复制if块到该方法已存在的重载中。
(3) 在Ribbon1类中,修改GetCustomUI过程,以便其从Ribbon1资源中返回XML,而不是调用加载项的GetResourceText过程。
Return My.Resources.Ribbon1
注:该加载项模板在Helpers隐藏区域里,包括一个名为GetResourceText的过程,获取XML文件的内容。虽然该过程做您需要的工作,但需要将资源的名称指定为一个字符串。这项技术有时较脆弱(对资源名称的改变将仍允许代码编译,但加载项在运行时将失败),因此最好添加XML内容到资源文件中并使用指定的语言来获取资源,正如上面的步骤所述。该模板包括GetResourceText过程,以便所见即所得——当创建和建立一个加载项时,有一个正工作的Ribbon定制而无须任何变化。
(4) 在Ribbon1类中,添加公共的变量声明,引用Word.Application对象。
Public Application As Word.Application
(5) 在相同文件的ThisAddIn局部类中,在创建Ribbon1类的实例的代码行下面,添加代码设置Ribbon1类的Application属性。
‘ In the RequestService method:
ribbon.Application = Application
此处的代码为:
        If serviceGuid = GetType(Office.IRibbonExtensibility).GUID Then
            If ribbon Is Nothing Then
                ribbon = New Ribbon1()
                ‘ In the RequestService method:
                ribbon.Application = Application
            End If
            Return ribbon
        End If
(6) 在Ribbon1类中添加下面的过程,以便可以为Ribbon中新的按钮处理onAction回调,在文档的光标处插入公司名。
5、测试该加载项
(1) 在“打开”菜单中,单击“全部保存”。
(2) 按F5运行项目,将开启Word 2007。
(3) 单击“My Tools Tab”选项卡,然后单击“Large Button”。代码将在文档的光标位置插入公司名称。
(4) 退出Word 2007。
VSTOChangeUI1 
可以创建安装项目并安装该加载项,就像前面的示例中所介绍的。在本例中,VSTO使得加载项更容易运行(和调试)。按F5键,项目会像所预料的一样运行。可以使用共享的外接程序模板来获得相同的行为,只需设置项目属性以表明在按F5时想要运行的应用程序,并选择正确的Office应用程序。


提示:您可以在评论中使用HTML标签,且任何与HTML标签相同的符号都会被理解为HTML标签并以相应的格式显示.如果您的评论中有代码,可以使用相应的标签,例如,如果有VB或VBA代码,则可以使用[vb]标签,即[vb]放置的代码[/vb],这样会很清晰地显示代码.

发表评论