ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > 综合应用 > 细品RibbonX(54):RibbonX和Visual Studio(2)

细品RibbonX(54):RibbonX和Visual Studio(2)

作者:绿色风 分类: 时间:2022-08-17 浏览:177
楼主
apolloh
下面,让我们继续使用Visual Studio为功能区添加更多的功能。
  • 创建带有组和控件的新选项卡
  • 在现有的选项卡中添加新控件
  • 在Office菜单中添加新控件
  • 重利用现有选项卡中的控件
  • 重利用Office菜单中的控件重利用是指将现有的控件实现新功能或者增强现有的功能。
    在Visual Studio中处理图形
    在使用Visual Studio时,必须提供图形作为加载项的一部分,这意味着要创建额外的代码。满足这项特定需求的XML作为customUI元素的一部分:


    1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
    2.           onLoad="Ribbon_Load"
    3.           loadImage="GetImage">

    在代码中,loadImage属性提供对GetImage()方法的调用,但GetImage()方法不知道要求向Office应用程序发送哪个图标或图像,因此必须以某种方式创建使它能处理任何需求。下面是GetImage()方法的代码:


    1.     Public Function GetImage(ByVal ImageName As String) As Bitmap
    2.         ' 包含传递到Office的位图
    3.         Dim ThisBitmap As Bitmap = New Bitmap(20, 20)

    4.         ' 发现图像名和相应的资源
    5.         Select Case ImageName
    6.             Case "Colorblk2"
    7.                 ThisBitmap = New Bitmap(My.Resources.Colorblk2)
    8.             Case "TIME"
    9.                 ThisBitmap = New Bitmap(My.Resources.TIME.ToBitmap())
    10.         End Select

    11.         ' 返回简单的位图
    12.         Return ThisBitmap
    13.     End Function
    本例使用两类不同的图像。第一个是标准的位图,Colorblk2,因此可以直接使用;第二个是一个图标,使用前必须调用ToBitmap()方法将它转换为位图。
    注意,代码需要从“资源”中请求图像,因此必须通过“添加资源”将图像添加到资源窗口。
    当装载功能区时执行任务
    使用Visual Studio创建的默认项目包括OnLoad()方法,当Office装载功能区时自动执行该方法。onLoad属性决定初始化时Office调用的方法,可以修改方法以满足需要,默认的方法名为onLoad()。本例中相应的回调代码为:


    1.     Public Sub Ribbon_Load(ByVal ribbonUI As Office.IRibbonUI)
    2.         '保存Ribbon引用
    3.         Me.ribbon = ribbonUI
    4.         '初始化下划线状态
    5.         UnderlineState = False
    6.         '显示装载消息
    7.         MessageBox.Show("功能区装载")
    8.     End Sub
    本例提供了一个以某种方式工作的控件示例,该控件取决于用户对另一个控件的选择。本例中,用户能够控制是否应用程序允许下划线功能。因为Excel需要确定在Ribbon装载时该控件的状态,所以代码包含了一个名为UnderlineState的初始化变量。
    在调试时,在代码中包括状态信息是有帮助的。这里,只是简单地告诉功能区已经装载。如果没有看到这个消息框,则表明加载项出现了错误。
    创建新的选项卡、组和控件
    最经常执行的任务之一是为应用程序创建新的选项卡、组和控件。为达到此目的,开始仍然需要添加XML。本例中,添加的XML代码如下:


    1.       <tab id="myTab"
    2.            label="我的选项卡">
    3.         <group id="MyGroup"
    4.                label="我的组">
    5.           <button id="myButton"
    6.                   label="我的按钮"
    7.                   image="Colorblk2"
    8.                   size="large"
    9.                   onAction="MyButton_ClickHandler"/>
    10.         </group>
    11.       </tab>
    创建了一个名为“我的选项卡”的选项卡,包含一个名为“我的组”的组,其中含有一个名为“我的按钮”的按钮。使用了自定义图像,因此在image属性中添加了相应的信息。当用户单击“我的按钮”时,调用myButton_ClickHandler()方法:


    1.     Public Sub myButton_ClickHandler(ByVal Control As Office.IRibbonControl)
    2.         ' 显示一条简单的消息
    3.         MessageBox.Show("我的按钮被单击")
    4.     End Sub
    修改或重利用已有的选项卡、组和控件
    有时,希望修改或重利用已有的选项卡、组或控件,而不是创建新的。例如,可能想改变“格式刷”的功能,满足内在的格式需求,或者完全隐藏某些选项卡、组或控件。
    下面的XML代码在“开始”选项卡中添加一个控件:


    1.       <tab idMso="TabHome">
    2.         <group id="BehaviorChange"
    3.                label="操作"
    4.                insertAfterMso="GroupFont">
    5.           <toggleButton id="StopUnderline"
    6.                         label="中止下划线功能"
    7.                         onAction="StopUnderline_ClickHandler"
    8.                         getPressed="StopUnderline_GetPressed"
    9.                         size="large"
    10.                         imageMso="ShapeFillColorPicker"
    11.                         insertBeforeMso="UnderlineGallery"/>  
    12.         </group>
    13.       </tab>
    在修改Office已有的元素时,使用idMso属性。新创建的“操作”组使用insertAfterMso属性指定该组在“开始”选项卡中的位置。
    本例中,toggleButton控件除了需要通常的onAction属性外,还需要getPressed属性来获取按钮的状态。这两个属性对应的回调代码为:


    1.     Public Sub StopUnderline_ClickHandler(ByVal Control As Office.IRibbonControl, ByVal Pressed As Boolean)
    2.         ' 存储当前按钮的状态
    3.         UnderlineState = Pressed

    4.         ' 在屏幕上显示正确的状态
    5.         ribbon.InvalidateControl(Control.Id)
    6.     End Sub

    7.     Public Function StopUnderline_GetPressed(ByVal Control As Office.IRibbonControl) As Boolean
    8.         ' 返回当前的按下状态
    9.         Return UnderlineState
    10.     End Function
    重利用现有的控件的处理过程与修改现有的控件不同。本例中,必须添加command元素:


    1.   <commands>
    2.     <command idMso="Underline"
    3.              onAction="myUnderline"/>
    4.     <command idMso="FileSaveA**cel97_2003"
    5.              onAction="FileSaveAs_ClickHandler"/>
    6.   </commands>
    本示例重利用了两个控件:“开始”选项卡中的“下划线”按钮,以及“Office菜单”中“另存为”菜单的“Excel 97-2003工作簿”项目。本示例重载onAction属性,这是最常执行的重载。然而,应该看看其它需要的回调,例如处理切换按钮时的getPressed。


    1.     Public Sub myUnderline(ByVal Control As Office.IRibbonControl, ByVal Pressed As Boolean, ByRef CancelDefault As Boolean)
    2.         ' 检查下划线控件的状态
    3.         If (UnderlineState) Then
    4.             ' 显示错误消息
    5.             MessageBox.Show("没有允许操作的下划线")

    6.             ' 设置控件使之不能被按下
    7.             Pressed = False

    8.             ' 在屏幕上显示正确的状态
    9.             ribbon.InvalidateControl(Control.Id)

    10.             ' 告诉Office不要执行默认的操作
    11.             CancelDefault = True
    12.         Else
    13.             ' 否则,告诉Office执行默认的操作
    14.             CancelDefault = False
    15.         End If
    16.     End Sub

    17.     Public Sub FileSaveAs_ClickHandler(ByVal Control As Office.IRibbonControl, ByRef CancelDefault As Boolean)
    18.         ' 包含用户的响应
    19.         Dim Response As DialogResult

    20.         ' 要求用户保存文件
    21.         Response = _
    22.            MessageBox.Show("保存为老版本. 确定吗?", _
    23.                            "老文件版本警告", _
    24.                            MessageBoxButtons.YesNo)

    25.         ' 检查响应
    26.         If Response = DialogResult.Yes Then
    27.             CancelDefault = False
    28.         Else
    29.             CancelDefault = True
    30.         End If
    31.     End Sub
    myUnderline()方法控制“下划线”控件是否按正常状态工作,还是基于用户是否按下“中止下划线功能”按钮而提供其它功能。正常状态工作时,该方法简单地设置CancelDefault为false,告诉Office执行缺省的操作。
    此外,当用户按下“中止下划线功能”按钮时,该方法显示一条消息,说明下划线控件不工作了。然后设置Pressed为false,意味着下划线控件不会显示像它正常状态下按下时的操作。接着,重设控件为期望的设置。最后,设置CancelDefault为true。
    修改或重利用Office菜单
    Office菜单包含许多配置和文件项,不直接与具体操作相关。当希望创建与具体操作无关的项目时,将其添加到OfficeMenu项中。


    1.     <officeMenu>
    2.       <menu idMso="FilePrepareMenu">
    3.         <button id="NewPrepButton"
    4.                 label="我的准备按钮"
    5.                 description="Prepare Time"
    6.                 image="TIME"
    7.                 insertBeforeMso="FileProperties"
    8.                 onAction="NewPrepButton_ClickHandler"/>
    9.       </menu>
    10.       <splitButton idMso="FileSaveAsMenu">
    11.         <menu idMso="FileSaveAsMenu">
    12.           <button id="SayHello"
    13.                   label="问好"
    14.                   description="This button says hello!"
    15.                   image="Colorblk2"
    16.                   onAction="SayHello_ClickHandler"/>
    17.         </menu>
    18.       </splitButton>
    19.     </officeMenu>
    上述代码演示了如何处理不同的控件,例如本例中的菜单和拆分按钮。相应的回调代码如下:


    1.     Public Sub NewPrepButton_ClickHandler(ByVal Control As Office.IRibbonControl)
    2.         ' 显示一条简单的消息
    3.         MessageBox.Show("准备好了吗")
    4.     End Sub

    5.     Public Sub SayHello_ClickHandler(ByVal Control As Office.IRibbonControl)
    6.         ' 显示一条简单的消息
    7.         MessageBox.Show("Hello")
    8.     End Sub
    本示例最终效果的部分截图如下:

     

     
    使用startFromScratch模式创建功能区
    要从头开始创建功能区,只需在ribbon元素中使用startFromScratch属性:


    1.     <ribbon startFromScratch="true">
  • 2楼
    xmyjk
    谢谢黄版分享。

    免责声明

    有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
    ------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

    评论列表
    sitemap