在Office 2007用户界面中添加自定义按钮
可以使用XML和编程代码的组合,添加自已的自定义按钮到Ribbon中,或者重复使用一些内置按钮。
使用XML添加控件
代码如下:
<?xml version=”1.0″ encoding=”utf-8″ ?>
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui” loadImage=”LoadImage” >
<ribbon startFromScratch=”false”>
<tabs>
<tab id=”tab1″ label=”Button Demo” keytip=”z” >
<group id=”group1″ label=”Demo Group”>
<button id=”button1″
enabled=”true”
getLabel=”GetLabel”
keytip=”A1″
getScreentip=”GetScreentip”
supertip=”This is a supertip for the button.”
getShowLabel=”GetShowLabel”
getShowImage=”GetShowImage”
getSize=”GetSize”
visible=”true”
image=”camera.bmp”
onAction=”OnAction” />
<button id=”button2″
getLabel=”GetLabel”
getShowLabel=”GetShowLabel”
size=”normal”
keytip=”A2″
imageMso=”TableDrawTable”
onAction=”OnAction” />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
本示例通过给选项卡元素的label属性赋文本值,添加了一个标题为Button Demo的自定义选项卡。该选项卡包含Demo Group组,其中含有名为button1和button2的两个自定义按钮,这些按钮通过visible、enabled和size属性来定义其属性。
通过设置属性值为字符串,来给这些属性赋值,例如supertip属性,或者直接指向编程代码过程。下图显示了应用上述XML后Microsoft Office Excel 2007中的结果。
在示例代码中,指定内置组件不同于自定义组件。一些属性有Mso后缀,而一些没有。例如,上面的示例中,id属性没有Mso标识符,对Office应用程序来说,这表示该按钮是一个自定义控件。在imageMso属性中,Mso后缀表明其是一个内置图像。带有Mso后缀的属性代表内置控件、命令和图像。
再来看看按钮的其它属性。首先,设置enabled属性值为True,使得按钮可用;若设置为False,则该控件被为灰色,表明按钮不在活动状态。其次,getLabel属性指向一个回调过程,定义按钮的标签。
keytip属性为按钮赋给一个按键提示。按键提示有时称作为访问键或加速键,并且使用快捷键组合可以激活某控件。要在自定义选项卡控件中使用按键提示,首先为选项卡设置按键提示,或者使用Office赋予的缺省按键提示。然后,为该控件赋予按键提示。例如,在代码中,选项卡有一个按键提示为z,按钮button1有一个按键提示为A1。当Ribbon显示时,按下Alt+z组合键将使得自定义选项卡获取焦点,然后,按下组合键A+1来激活该按钮,并执行在onAction属性中定义的过程,插入文本到工作表中。
在XML中接着为getScreentip属性。屏幕提示(Screentips)是在鼠标指针指向Ribbon中某对象上时显示的小框,用于提供关于所选对象的信息。相似地,supertip属性(如果指向一个回调过程则为getSupertip属性)提供该对象的额外信息。
当某属性带有前缀”get”表明该属性指向一个回调过程。因此在本代码中,getScreentip属性指向名为GetScreentip的回调过程。
注:回调过程不一定使用与其属性相同的名称,可以使用下列代码行getScreentip=”DoSomething”。同时,指向回调过程的属性不一定有前缀get,例如,在XML代码中,onAction属性指向名为“OnAction”的回调。
supertip属性代表了控件属性的另一方面。一个没有get前缀的属性代表可以明确地给其赋文本值。在supertip属性的情形下,直接赋文本值取代了回调过程。也有例外,如onAction属性,该属性没有前缀get。
getShowLabel属性和getShowImage属性都指向涉及到Boolean值的回调过程。例如,设置getShowLabel属性为True导致显示控件时为按钮显示标签。要明确地设置该属性的值,使用showLabel属性。
getSize属性用于指定按钮的尺寸。如果如button2明确地设置size,可选值为normal和large。
再看看上面的XML代码,visible属性设置为一个Boolean值,确定在Ribbon中是否显示按钮。
接下来,button1的image属性用于为按钮指定一个自定义图像。同样地,button2的imageMso属性用于为按钮指定内置图像。
最后,正如前面所提到的,onAction属性指向一个回调过程,当单击该按钮时执行此过程。
对Ribbon组件分配功能
在前面的XML示例中,一些属性指向回调过程。例如,button元素有onAction属性,当单击该按钮时,调用onAction方法或者回调过程。在onAction方法中的代码为按钮提供功能。这些过程被称为回调,因为当单击该按钮时,该操作通知Microsoft Office需要注意该控件。然后,Microsoft Office调用返回通过onAction属性定义的方法,并执行包含在方法中的操作。下面介绍getLabel属性调用的GetLabel回调过程。
Public Function GetLabel(ByVal control As IRibbonControl) As String
Dim strLabel As String = “”
Select Case control.ID
Case “button1″: strLabel = “Insert Text”
Case “button2″: strLabel = “Insert More Text”
End Select
Return strLabel
End Function
当Office调用GetLabel过程时,IRibbonControl对象代表被传递的按钮。该过程测试对象的Id属性并依赖其值,赋文本给一个变量。然后,返回该变量到Microsoft Office,显示其文本作为按钮的标签。
getScreentip属性也指向一个回调过程。在本例中,该过程返回一个字符串,当鼠标移动到该按钮上时显示该字符串。
Public Function GetScreenTip(ByVal control As IRibbonControl) As String
Return “Inserts text into the active worksheet.”
End Function
getShowLabel回调过程和getShowImage回调过程对Microsoft Office返回一个Boolean值,指定是否在显示自定义选项卡时显示各自的对象(标签或图像)。
Public Function GetShowLabel(ByVal control As IRibbonControl) As Boolean
Dim bolShow As Boolean
Select Case control.ID
Case “button1″: bolShow = True
Case “button2″: bolShow = False
End Select
Return bolShow
End FunctionPublic Function GetShowImage(ByVal control As IRibbonControl) As Boolean
Return True
End Function
GetShowLabel过程测试该控件的Id属性,并取决于其值,设置Boolean变量为True或False。然后将该变量返回至Office。
接着,getSize属性指向GetSize回调过程。
Public Function GetSize(ByVal control As IRibbonControl) As RibbonControlSize
‘ Selecting one of the two RibbonControlSize enumeration values
‘ sets the size of the button.
Return RibbonControlSize.RibbonControlSizeRegular
‘ RibbonControlSize.RibbonControlSizeLarge
End Function
在这个过程中,RibbonControlSize枚举的值被返回到Office。RibbonControlSizeRegular用于为标准尺寸的控件,RibbonControlSizeLarge值用于代表一个大尺寸控件。
最后,当单击该按钮时,调用onAction回调过程。在本例中,该过程测试正调用控件的Id属性,并插入指定的文本到工作表的A1单元格中。
Public Sub OnAction(ByVal control As IRibbonControl)
Select Case control.ID
Case “button1″: applicationObject.Range(”A1″).Value = _
”This button inserts text.”
Case “button2″: applicationObject.Range(”A1″).Value = _
”This button inserts more text.”
End Select
End Sub
有两种方式来配置自定义Ribbon:
- 修改由支持Office Fluent UI的Office应用程序创建的Open XML格式文件。
- 使用加载项。
使用Open XML文件创建自定义Ribbon并不复杂。
使用Open XML文件创建自定义Ribbon
1、将文档扩展名改变ZIP,并打开。
2、添加包含XML自定义代码的文件夹。
3、修改文档的相关联文件,指向自定义文件夹。
4、重命名文档的文件扩展名,以恢复文档。
5、在Office应用程序中打开该文档。
6、添加代码到文档中,以提供自定义Ribbon功能。
使用加载项自定义Ribbon同样简单。
在创建加载项项目之后,实现IRibbonExtensibility接口,该接口包括在Microsoft.Office.Core命名空间中,包含一个名为GetCustomUI的方法,使用该方法来返回XML Ribbon定制代码到Office。然后,添加编程过程来为自定义Ribbon提供其功能。
在Ribbon中添加自定义按钮
下面介绍的过程,将组合在Office Excel 2007中创建包含自定义组和两个自定义按钮到Ribbon中的信息。这些按钮将插入文本到工作表中。
创建加载项解决方案来在Ribbon中添加自定义按钮
1、开启Visual Studio 2005。
2、在“文件”菜单中,单击“新建项目”命令。
3、在“新建项目”对话框中的“项目类型”窗格,展开“其它项目类型”节点,单击“扩展性”,然后选择“共享的外接程序”。
4、在名称框中,输入RibbonDemo,然后单击“确定”来创建该项目。
5、在“共享外接程序向导”的第一页,单击“下一步”按钮。
6、在“选择编程语言”页,选择Visual C#或Visual Basic,然后单击“下一步”。
7、在“选择应用程序主机”页,清除除Microsoft Excel外的所有选择,然后单击“下一步”。
8、在“输入名称和说明”页中,输入项目的名称和说明,然后单击“下一步”。
9、在“选项外接程序选项”页,选择“我希望在加载宿主应用程序的同时加载我的外接程序”,然后单击“下一步”,接着单击“完成”。
Visual Studio创建了一个包含两个项目的解决方案——加载项自身和安装项。安装项可以使在其他用户的计算机上安装该加载项,并且使得在设计时安装和卸载加载项更容易。
添加对项目的引用
要与Excel 2007和Ribbon对象模型相交互,需要添加对两个类型库的引用。
1、在解决方案管理器中,展开引用文件夹。
如果没有看到引用文件夹,则在“项目”菜单中,单击“显示所有文件”。
2、删除Microsoft.Office.Core引用。
3、右键单击引用文件夹,然后单击“添加引用”。
4、单击“COM”选项卡,选择“Microsoft Office 12.0 Object Library”和“Microsoft Excel 12.0 Object Library”并添加。
5、在打开的代码文件中,添加下面的代码:
Imports Microsoft.Office.Core
Imports Excel = Microsoft.Office.Interop.Excel
创建定制Ribbon的XML文件
创建XML文件,添加组件并设置组件的属性。
1、在“项目”菜单中,单击“添加新项”。
2、在“添加新项”对话框中,选择“XML文件”,并将其命名为Ribbon.xml,然后单击“添加”。
3、添加上文中已准备好的XML标记。
添加XML文件作为嵌入的资源
1、在解决方案管理器中,选择Ribbon.xml。
2、在属性窗口,选择“生成操作”,然后在选项列表中选择“嵌入的资源”。
3、在“项目”菜单中,单击“RibbonDemo属性”。
4、单击“资源”选项卡。
5、从解决方案管理器中,拖动Ribbon.xml到资源设计面板中。
这个操作创建了一个新的基于文件的资源。现在,Ribbon.xml文件自动作为应用程序资源来存储,并且可以通过使用Visual Basic或Visual C#语言获取其内容。
6、关闭资源窗口。当出现提示时,单击“是”保存资源。
访问宿主应用程序并处理Ribbon
需要创建Excel的实例并添加Ribbon接口。
1、在解决方案管理器中,右键单击“Connect.cs”或“Connect.vb”,然后单击“查看代码”。
2、找到已存在的applicationObject变量的声明,对其修改并指向Excel.Application对象。也就是说,修改该声明如下:
Private applicationObject As Excel.Application
3、修改OnConnection方法中的第一行,创建Excel.Application对象的一个实例。
applicationObject = DirectCast(application, Excel.Application)
4、在Visual Basic中,修改位于类顶部以Implements开始的代码行,添加实现IRibbonExtensibility命名空间的支持。Visual Basic将自动插入GetCustomUI过程(如未自动插入,则应手工输入)。
Implements Extensibility.IDTExtensibility2, IRibbonExtensibility
5、修改GetCustomUI方法如下:
Public Function GetCustomUI(ByVal RibbonID As String) As String _
Implements Microsoft.Office.Core.IRibbonExtensibility.GetCustomUI
Return My.Resources.Ribbon
End Function
6、添加上文中给出的代码。该方法测试控件的Id属性并插入指定的文本到工作表单元格A1中。由于菜单控件使用自定义图像,需要按下面的步骤添加自已的图像。
7、在解决方案管理器中,右键单击项目名,指向“添加”,然后单击“现有项”。
8、导航并选择图像,然后单击“添加”按钮。
9、选择图像文件,在属性窗格中的“生成操作”里,单击“嵌入的资源”。
10、再次右键单击项目名称,然后单击“属性”。
11、单击“资源”选项卡,然后从解决方案管理器窗格中,拖放图像文件到资源选项卡中。
测试该项目
1、在“文件”菜单中,单击“全部保存”。
2、如果Excel 2007正在运行则退出。
3、在“生成”菜单中,单击“生成解决方案”。
4、在解决方案管理器中,右击“RibbonDemoSetup”,然后单击“生成”。
5、右键单击RibbonDemoSetup,然后单击“安装”。
RibbonDemo安装向导出现。
6、单击每一页的“下一步”按钮,然后单击最后一页的 “关闭”按钮。
7、开启Excel。
此时,将出现Button Demo选项卡,包含Group Demo组。有一个按钮没有标签,因为其getShowLabel属性被设置为False。
8、单击“Insert Text”按钮,此时Excel将在工作表单格A1中插入文本,如图所示。
9、退出Excel。
10、在Visual Studio的解决方案管理器中,右键单击RibbonDemoSetup,然后单击“卸载”。
