存档在 ‘.NET开发’ 分类中.
当使用VSTO创建Word或Excel解决方案时,可以直接从Visual Studio里与Word或Excel应用程序相交互。这是因为VSTO与Visual Studio已整合在一起。
Word和Excel作为设计器
在已经创建新的Excel或Word文档或模板项目后,该文档在Visual Studio环境里作为设计器是可用的。事实上,整个应用程序在Visual Studio里是可用的。
设计器是正创建的应用程序的用户接口的容器。例如,如果在Word VBA解决方案里创建用户窗体,VBE为应用程序显示该用户窗体作为设计器。然后,可以添加控件到用户窗体。当使用VSTO创建解决方案时,同样的经历现在可用于Word和Excel解决方案中。该文档是一个设计器,可以从工具箱中拖动控件在其中。
能够在设计器中添加两种类型的控件:Windows Forms控件和宿主控件。
设计器是该应用程序的可见的表现,每个设计器与代码文件相关联(正如先前提到的,该代码有时被称为代码后台的文件)。可以使用一些方法从设计器视图切换到代码视图。一种方式是在文档中单击右键,然后在快捷菜单中单击查看代码。
当在代码视图中时,可以右键单击代码编辑器,并从快捷菜单中选择查看设计器,在Visual Studio里打开该设计器。也可以在解决方案管理器中右击代码文件,打开快捷菜单,会提供相看代码和相看设计器选项。

图:从代码编辑器切换到设计器
在VSTO里的代码文件
当创建新的VSTO解决方案时,Visual Studio创建许多文件。例如,如果在Visual Studio里

图:当选择显示所有文件时在解决方案管理器中显示的文件
在ThisDocument.vb源文件中编写代码。该文件包含ThisDocument类,有两个事件句柄(ThisDocument_Startup和ThisDocument_Shutdown)。可以在写字板里打开这个文件查看其内容。当然,不能使用写字板添加代码到文件中。ThisDocument.vb文件对Visual Studio里的文件有用。可以在解决方案管理器中右击该文件,选择查看代码。
这里,可以使用Visual Studio IDE的所有丰富的功能,包括IntelliSense和调试工具来使用代码任务更容易。在ThisDocument.vb后面有一些额外的文件,包含VSTO自动产生的代码。这些文件是ThisDocument.Designer.xml和ThisDocument.Designer.vb。
2007-11-05, 01:56 pm | 作者:
drexcel | 305 次阅读
编者注:在阅读本文前,您应先阅读过“在Office 2007用户界面中添加自定义按钮”和“自定义Office 2007用户界面的快速访问工具栏”两篇文章,并熟悉其中的操作步骤。本文主要提供自定义的XML代码和回调过程代码,以及相应的说明。
可以使用XML和编程代码相结合,在Ribbon中添加自已的自定义对话框启动器(dialogBoxLaunchers)。
用于添加控件的XML
可以使用dialogBoxLauncher元素来添加单个的对话框启动器,下面是代码:
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon startFromScratch=”false”>
<tabs>
<tab id=”tab1″ label=”DialogBoxLauncher Demo” >
<group id=”group1″ label=”Demo Group”>
<button id=”button1″
imageMso=”BevelTextGallery”
label=”A Button”
onAction=”OnAction”
size=”large” />
<dialogBoxLauncher>
<button id=”button2″
screentip=
“Launched by the DialogBoxLauncher
control.”
onAction=”OnAction” />
</dialogBoxLauncher>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
通过给选项卡元素的label属性赋文本值,本示例添加标题为DialogBoxLauncher Demo的自定义选项卡到Office Fluent Ribbon中。这个选项卡包含名为Demo Group组,包含一个名为button1的自定义按钮和一个对话框启动器。该对话框启动器包含一个名为button2的按钮。
注:对话框启动器控件必须包含一个按钮,并且必须作为组元素里的最后一个元素出现。
这个对话框启动器是按钮的容器。通过使用例如screentip和onAction属性来定义该按钮的属性。这些属性被明确地赋值,例如设置screentip属性等于字符串,或者给onAction属性指定过程代码。
在XML中,screentip属性设置当鼠标指针移动到对话框启动器上时显示的小方框,提供关于该项目简洁的上下文帮助。最后,onAction属性指向当单击按钮时执行的回调过程。
对Ribbon组件分配功能
在前面的XML示例中,onAction属性指向一个回调过程。当单击该对话框启动器按钮时,调用OnAction方法或者回调过程。在OnAction方法中的代码为该按钮提供功能。这些过程被称为回调,因为当单击该按钮时,该操作通知Microsoft Office需要注意该控件。然后,Microsoft Office调用返回通过OnAction属性定义的方法,并执行包含在方法中的操作。
Public Sub OnAction(ByVal control As IRibbonControl)
Select Case control.ID
Case “button1″
applicationObject.Range(”A1″).Value = “You selected A button.”
Case “button2″
MessageBox.Show(”You can substitute your own text here.”, “dialogBoxLauncher”)
End Select
End Sub
注:要访问MessageBox类的命名空间,必须在代码顶部声明Imports System.Windows.Forms。
当单击对话框启动器中的按钮时,会通知Microsoft Office。然后,Microsoft Office调用返回到该加载项,触发OnAction回调过程,传递代表该按钮的control对象。测试control对象的Id属性,根据其值,Microsoft Office执行其中的切换语句。特别地,如果该属性的值等于button2,将显示自定义对话框。
实现Ribbon定制
参照“在Office 2007用户界面中添加自定义按钮”一文中的步骤,使用Visual Studio 2005整合上述XML和回调过程,最后的结果如图。

2007-11-02, 01:39 pm | 作者:
drexcel | 933 次阅读
编者注:在阅读本文前,您应先阅读过“在Office 2007用户界面中添加自定义按钮”和“自定义Office 2007用户界面的快速访问工具栏”两篇文章,并熟悉其中的操作步骤。本文主要提供自定义的XML代码和回调过程代码,以及相应的说明。
可以使用XML和编程代码相结合,在Ribbon中添加自已的自定义复选框(checkboxes),或者重复使用一些内置复选框。
用于添加控件的XML
可以使用checkBox元素来添加单个的复选框,通过使用属性如label属性来给复选框赋属性值。下面是代码:
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon startFromScratch=”false”>
<tabs>
<tab id=”tab1″ label=”CheckBox Demo” keytip=”z” >
<group id=”group1″ label=”Demo Group”>
<checkBox id=”checkbox1″
enabled=”true”
getLabel=”GetLabel”
keytip=”A1″
getScreentip=”GetScreentip”
supertip=”This is a super tip for the checkBox.”
visible=”true”
getPressed=”GetPressed”
onAction=”OnAction” />
<checkBox id=”checkbox2″
getLabel=”GetLabel”
onAction=”OnAction” />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
通过赋予tab元素label属性的文本,本示例在Office Fluent Ribbon中添加标题为CheckBox Demo的自定义选项卡。该选项卡包含Demo Group组,组中包含两个名为checkBox1和checkBox2的自定义复选框。这些复选框通过visible属性、enabled属性和keytip属性等来定义其属性。可以通过设置该属性相对应的字符串,明确地给这些属性赋值,例如supertip属性,或者直接指向编程代码过程。
enabled属性被设置为Ture,使得该复选框可用。当设置其为False时,该控件变灰,表明该复选框处于非活动状态。接下来的getLabel属性指向一个回调过程,来为该复选框定义标签。
keytip属性为复选框赋予按键提示(KeyTip)。按键提示有时称作访问键或加速键,可用于作为快捷键组合来激活控件。要在自定义选项卡控件中使用按键提示,首先为选项卡设置按键提示,或者使用Microsoft Office赋予的缺省的按键提示。然后,为该控件赋予按键提示。例如,在代码中,选项卡有一个等于z的快捷提示,checkbox1复选框有一个快捷提示等于A1。当Office Fluent Ribbon显示时,按下Alt+z组合键来使自定义选项卡获取焦点。然后,按下A+1组合键来激活该复选框,并执行在onAction属性中定义的过程。
接着,会看到getScreentip属性。屏幕提示是在鼠标指针移动到Office Fluent Ribbon中某项目上时出现的小框,提供了所选对象的信息。类似地,supertip属性(如果指向某回调过程,则为getSupertip属性)提供了关于该对象额外的信息。
前面带有get前缀的属性表明该属性指向回调过程,因此在代码中,getScreentip属性指向名为GetScreentip的回调过程。
注:回调过程的名称不一定与使用的属性名称相同。指向回调过程的属性也不一定在其前面都有get,例如onAction属性指向名为OnAction的回调过程。
supertip属性代表了控件属性的另一方面。一个没有get前缀的属性表示可以明确地给其赋文本值。在supertip属性的情形下,直接赋文本值取代了回调过程。也有例外,如onAction属性,该属性没有前缀get。
再看上面的XML代码,设置visible属性为Boolean值确定是否在Ribbon中显示该复选框。接着,getPressed属性指定该复选框缺省的行为。如果该复选框显示时,属性的值为True,表明选取了该复选框。相反,如果其值为False,则取消了该复选框的选取。
最后,onAction属性指向一个回调过程,当单击该复选框时执行此过程。
对Ribbon组件分配功能
在前面的XML示例中,一些属性指向回调过程。例如,checkbox元素有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 “checkbox1″: strLabel = “Insert text.”
Case “checkbox2″: strLabel = “Insert more text.”
End Select
Return strLabel
End Function
当Microsoft 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
GetPressed回调过程返回一个Boolean值,指定复选框的缺省条件。如果为True,复选框显示时为选中状态。返回False(缺省值)表明该复选框的初始显示状态为没选中。
Public pressedState As Boolean = False
Public Function GetPressed(ByVal control As IRibbonControl) As Boolean
Return pressedState
End Function
最后,当单击复选框时,调用OnAction回调过程。在本例中,该过程测试正调用的控件的Id属性,然后插入该控件指定的文本到工作表A1单元格中。
Public Sub OnAction(ByVal control As IRibbonControl, ByVal pressed As Boolean)
If pressed Then
applicationObject.Range(”A1″).Value = _
“You selected the check box.”
Else
applicationObject.Range(”A1″).Value = _
“You cleared the check box.”
End If
pressedState = pressed
End Sub
实现Ribbon定制
参照“在Office 2007用户界面中添加自定义按钮”一文中的步骤,使用Visual Studio 2005整合上述XML和回调过程,最后的结果如图。

2007-11-01, 02:36 pm | 作者:
drexcel | 493 次阅读
编者注:在阅读本文前,您应先阅读过“在Office 2007用户界面中添加自定义按钮”和“自定义Office 2007用户界面的快速访问工具栏”两篇文章,并熟悉其中的操作步骤。本文主要提供自定义的XML代码和回调过程代码,以及相应的说明。
可以使用XML和编程代码相结合,在Ribbon中添加自已的自定义组合框(comboBoxes),或者重复使用一些内置组合框。
用于添加控件的XML
可以使用comboBox元素来添加单个的组合框,通过使用属性如label属性来给组合框赋属性值。下面是代码:
<?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=”ComboBox Demo” keytip=”z” >
<group id=”group1″ label=”Demo Group”>
<comboBox id=”comboBox1″
enabled=”true”
getText=”GetText”
getLabel=”GetLabel”
image=”camera.bmp”
getShowLabel=”GetShowLabel”
getShowImage=”GetShowImage”
getScreentip=”GetScreentip”
supertip=”This is a supertip for the combo box.”
keytip=”A1″
visible=”true”
getItemCount=”GetItemCount”
getItemLabel=”GetItemLabel”
getItemImage=”GetItemImage”
getItemScreentip=”GetItemScreentip”
getItemSupertip=”GetItemSupertip”
onChange=”OnChange” />
<comboBox id=”comboBox2″
label=”Insert More Text.”
getText=”GetText”
imageMso=”TableDrawTable” />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
通过赋予tab元素的label属性文本,本示例在Office Fluent Ribbon中添加标题为ComboBox Demo的自定义选项卡。该选项卡包含Demo Group组,组中包含两个名为comboBox1和comboBox2的自定义组合框。这些复选框通过visible属性、enabled属性和label属性等来定义其属性。可以通过设置该属性相对应的字符串,明确地给这些属性赋值,例如supertip属性,或者直接地指向编程代码过程。
现在来看看这段示例代码。enabled属性被设置为Ture,使得该组合框可用。当设置其为False时,该控件变灰,表明该组合框处于非活动状态。接下来的getText属性指向一个回调过程,来定义在开始显示时组合框里显示的文本。
getLabel属性也指向一个回调过程,返回显示在组合框中的标签。接着,comboBox1的image属性指定该组合框的自定义图像。同样,comboBox2的imageMso属性为该组合框指定内置的图像。
可以使用image和imageMso属性与customUI元素的loadImage属性一起作用。当使用image属性指定一个图像时,将调用loadImage回调过程来装载图像,然后,在Ribbon中显示该图像。
Public Function LoadImage(ByVal imageName As String) As Bitmap
Dim assembly As Assembly = Assembly.GetExecutingAssembly()
Dim stream As Stream = assembly.GetManifestResourceStream(”CodeSnippetTester.” & imageName)
Return New Bitmap(stream)
End Function
在这个过程中,一个位图(bitmap)图像被返回到Microsoft Office。当调用该过程时,该图像作为一个集成的资源被获取并赋给Stream对象。最后,该图像作为Bitmap对象来返回。
getShowLabel属性和getShowImage属性指向涉及到Boolean值的回调过程。例如,设置getShowLabel属性为True导致在显示该控件时显示组合框的标签。如果想明确地设置属性的值,使用showLabel属性。
接下来,看看getScreentip属性。屏幕提示是在鼠标指针移动到Office Fluent Ribbon中某项目上时出现的小框,提供了所选对象的简单的上下文相关信息。同样,supertip属性(如果指向某回调过程,则为getSupertip属性)提供了关于该对象额外的信息。
另外对于getScreentip属性和supertip属性要注意的是,无论何时看到带get前缀的属性,该属性指向一个回调过程。因此,在代码中,getScreentip属性指向名为GetScreentip的回调过程。
注:回调过程的名称不一定与使用的属性名称相同。指向回调过程的属性也不一定在其前面都有get,例如在上面的XML代码中,onChange属性指向名为OnChange的回调过程。
supertip属性代表了控件属性的另一方面。一个没有get前缀的属性表示可以明确地给其赋文本值。在supertip属性的情形下,直接赋文本值取代了回调过程。也有例外,如onAction属性,该属性没有前缀get。
keytip属性为组合框赋予按键提示(KeyTip)。按键提示有时称作访问键或加速键,按键提示表明当使用键盘访问系统时,在访问程序功能时按下的键。要在自定义选项卡控件中使用按键提示,首先为选项卡设置按键提示,或者使用Microsoft Office赋予的缺省的按键提示。然后,为该控件赋予按键提示。例如,在代码中,选项卡有一个等于z的按键提示,comboBox1组合框有一个按键提示等于A1。当Office Fluent Ribbon显示时,按下Alt键来显示选项卡的按键提示。然后,按下z键使自定义选项卡获取焦点。最后,按下A+1组合键来激活该组合框。
再看上面的XML代码,设置visible属性为Boolean值确定是否在Ribbon中显示该组合框。接下来的一些属性指向组合框的下拉列表的项目。例如,getItemCount属性返回在用户单击组合框时下拉列表中的项目数。getItemLabel和getItemImage属性执行与getLabel和getImage属性类似的功能。getItemScreentip和getItemSupertip属性指定下拉项目的屏幕提示和增强提示(supertips)。
最后,onChange属性指向一个回调过程,当单击该组合框里某项目时执行此过程。
对Ribbon组件分配功能
在前面的XML示例中,一些属性指向回调过程。例如,comboBox元素有onChange属性,当单击该组合框时,调用OnChange方法或者回调过程。在OnChange方法中的代码为组合框提供功能。这些过程被称为回调,因为当单击该组合框的下拉列表里的项目时,该操作通知Microsoft Office需要注意该控件。然后,Microsoft Office调用返回通过OnChange属性定义的方法,并执行包含在方法中的操作。下面介绍这些回调过程。
getText属性指向GetText回调过程,指定在初始显示控件时显示在组合框中显示的文本。
Public Function GetText(ByVal control As IRibbonControl) As String
Select Case control.ID
Case “comboBox1″: strText = “Camera”
Case “comboBox2″: strText = “Video”
End Select
Return strText
End Function
当Microsoft Office调用GetText过程时,IRibbonControl对象代表所传递的组合框。该过程测试对象的Id属性,根据所获取的值,赋文本值给变量。然后将该变量返回到Microsoft Office,显示其文本作为组合框里的缺省文本。
getLabel属性调用GetLabel回调过程。
Public Function GetLabel(ByVal control As IRibbonControl) As String
Dim strLabel As String = “”
Select Case control.ID
Case “combo box1″: strLabel = “Insert text.”
Case “combo box2″: strLabel = “Insert more text.”
End Select
Return strLabel
End Function
与GetText回调过程相似,当通过Microsoft Office调用GetLabel过程时,传递一个代表组合框的IRibbonControl对象。该过程测试该对象的Id属性,根据其值,赋文本值给变量。然后该变量返回给Microsoft Office,显示其文本作为组合框的标签。
getShowLabel和getShowImage回调过程返回一个Boolean值,指定当显示自定义选项卡时是否显示各自的对象(一个标签或一个图像)。
Public Function GetShowImage(ByVal control As IRibbonControl) As Boolean
Return True
End Function
Public Function GetShowLabel(ByVal control As IRibbonControl) As Boolean
Select Case (control.ID)
Case “comboBox1″ : Return True
Case “comboBox2″ : Return False
End Select
End Function
在GetShowLabel过程中,测试控件的Id属性,并根据其值,设置boolean变量为true或false。然后返回该变量到Microsoft Office。
getScreentip属性也指向一个回调过程。在本例中,该过程返回一个字符串,当鼠标移动到组合框上时,显示该字符串。
Public Function GetScreenTip(ByVal control As IRibbonControl) As String
Return “Inserts text into the active worksheet.”
End Function
getItemCount回调过程返回一个整数值,指定在显示自定义选项卡时是否显示各自的对象(相标签或图像)。
Public Function GetItemCount(ByVal control As IRibbonControl) As Integer
Return 3
End Function
接下来,getItemImage属性指向GetItemImage回调过程。
Public Function GetItemImage(ByVal control As IRibbonControl, ByVal itemIndex As Integer) As Bitmap
Dim imageName As String
Select Case (itemIndex)
Case 0: imageName = “camera.bmp”
Case 1: imageName = “video.bmp”
Case 2: imageName = “mp3device.bmp”
End Select
Dim assembly As Assembly = Assembly.GetExecutingAssembly()
Dim stream As Stream = assembly.GetManifestResourceStream(”CodeSnippetTester.” & imageName)
Return New Bitmap(stream)
End Function
在该过程中,一个位图图像被返回到Microsoft Offie。当该过程被调用时,图像赋值给一个变量。然后,作为一个集成的资源流获取该图像文件,并赋给一个Stream对象。最后,作为Bitmap对象返回该图像。
接下来,当单击组合框中的某项目时,调用OnChange回调过程。在本例中,该过程测试正调用控件的Id属性,并插入该控件指定的文本到工作表的A1单元格中。
Public Sub OnChange(ByVal control As IRibbonControl, ByVal text As String)
applicationObject.Range(”A1″).Value = _
”You selected ” & text
End Sub
实现Ribbon定制
参照“在Office 2007用户界面中添加自定义按钮”一文中的步骤,使用Visual Studio 2005整合上述XML和回调过程。
很遗憾,经过调试,本程序未实现最终的效果。除了上文中要添加的引用外,还添加了对NET选项卡中System.Drawing的引用,在代码顶部添加了:
Imports System.Drawing
Imports System.Reflection
Imports System.IO
相应修改了部分程序代码,但最终结果未实现。所产生的结果见下图:

本文与前面的系列文章一样,均整理自MSDN,本文中未实现的内容只好留待以后进一步研究了,如果有朋友找到了其中的错误,请指正!
2007-11-01, 01:08 pm | 作者:
drexcel | 826 次阅读
可以使用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,然后单击“卸载”。