zoukankan      html  css  js  c++  java
  • [转]VSTO Office二次开发RibbonX代码结构

    前段时间,碰到对于PPT中控制一些命令的问题,也是很是查找了不少的资料,最后使用的是RibbonX的形式解决的,发现RibbonX也是如此的高效。
    文章来自:《细品RibbonX(9):层次分明的RibbonX代码结构》
    原文如下:(虽是对Excel的操作,但一些命令是通用的)
    在前面的一些文章中,我们已经介绍过定制功能区的代码。在详细探讨功能区各元素之前,我们将先了解完整的RibbonX代码结构、如何使用各类工具定制功能区、以及至关重要的XML知识。下面,让我们先看看完整的RibbonX代码结构。 如果忽略定义控件的XML元素,那么完整的RibbonX结构如下:

    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" ...>
    <commands>
    <command ... />
    </commands>
    <ribbon ...>
    <officeMenu>
    可用于Office菜单中的任何控件类型
    </officeMenu>
    <qat>
    <sharedControls>
    <control>,<button> or <separator>控件类型
    </sharedControls>
    <documentControls>
    <control>,<button> or <separator>控件类型
    </documentControls>
    </qat>
    <tabs>
    <tab ... >
    <group ... >
    所有控件类型
    </group>
    </tab>
    </tabs>
    <contextualTabs>
    <tabSet idMSO="TabSetChartTools">
    <tab ... >
    <group ... >
    所有控件类型
    </group>
    </tab>
    </tabSet>
    </contextualTabs>
    </ribbon>
    </customUI>
    其中,省略号表示一个或多个可选的属性。可以看出,RibbonX代码结构是层次分明的。现在,让我们初步了解代码结构中的元素。
    <customUI>元素是XML的根容器,命名空间将其识别为RibbonX文档。
    <commands>元素用来重复利用内置控件。
    <ribbon>元素包含功能区中所有可以利用的元素。可以包含下列元素以控制功能区的相应部分。
    <officeMenu>元素用来定制Office菜单。
    <sharedControls>元素代表共享控件。
    <documentControls>元素代表文档控件。
    <qat>元素用来定制快速访问工具栏。
    <tabs>元素表示选项卡的集合。
    <tab>元素创建选项卡。
    <contextualTabs>元素创建上下文选项卡。
    <group>元素用来创建组。

    下面,让我们使用Excel示例来看看完整的RibbonX结构能够实现的用户界面。
    禁用命令
    使用command元素能够重载命令或者禁用命令。例如,下面的XML禁用“保存”命令:

    <commands>
    <command idMso="FileSave" enabled="false" />
    </commands>

    结果如图1所示: 
    RibbonX9-1
    图1:禁用“保存”命令,该命令已变灰
    从头开始创建功能区
    将ribbon元素的StartFromScratch属性设置为True,从而去除所有的功能区界面元素,然后从头开始设计功能区。其XML为:

    <ribbon startFromScratch="true">

    在Office按钮菜单中添加自定义项
    可以向Office按钮菜单中添加合适的自定义项。例如,下面的XML在Office按钮中添加按钮和菜单:

    <officeMenu>
    <button id="rxOMBtn1" label="My Office Button1" />
    <button id="rxOMBtn2" label="My Office Button2" />
    <menu id="MyOfficeMenu" label="My Office Menu">
    <button id="rxSend1" label="My Menu1" />
    <button id="rxSend2" label="My Menu2" />
    <button id="rxSend3" label="My Menu3" />
    <button id="rxSend4" label="My Menu4" />
    <button id="rxSend5" label="My Menu5" />
    <button id="rxSend6" label="My Menu6" />
    <button id="rxSend7" label="My Menu7" />
    <button id="rxSend8" label="My Menu8" />
    <button id="rxSend9" label="My Menu9" />
    </menu>
    </officeMenu>

    结果如图2所示: 
    RibbonX9-2
    图2:在Office按钮中添加项目
    自定义快速访问工具栏(QAT)
    当将ribbon元素的StartFromScratch属性设置为True后,我们可以在设计时重新自定义快速访问工具栏。例如,下面的XML在QAT中放置“字体”组合框和“边框”拆分按钮:

    <qat>
    <sharedControls>
    <control idMso="Font" />
    </sharedControls>
    <documentControls>
    <control idMso="BordersGallery" />
    </documentControls>
    </qat>

    其中sharedControls表示放置在其中的控件为共享控件,而documentControls表示放置其中的控件为文档控件(注意,周围带有边框)。结果如图3所示: 
    RibbonX9-3
    图3:自定义快速访问工具栏
    自定义功能区
    下面的XML在功能区中添加一个名为“Menu”的选项卡。

     <tab id="rxExcelVBA" label="Menu">

    接着,使用下面的代码在该选项卡中添加组。

    <group idMso="GroupInsertChartsExcel" />

    上述代码添加内置的“图表”组。结果如下图4所示: 
    RibbonX9-4
    图4:在自定义选项卡“Menu”中添加“图表”组

    <group id="rxAuditMisc" label="My Sample">
    <box id="rxSortBox">
    <control idMso="SortAscendingExcel" showLabel="false" />
    <control idMso="SortDescendingExcel" showLabel="false" />
    <control idMso="SortDialog" showLabel="false" />
    </box>
    <control idMso="Copy" />
    <control idMso="PasteMenu" />
    <separator id="rxAuditMiscSeparator1" />
    <control idMso="NameManager" />
    <control idMso="ViewFreezePanesGallery" />
    <control idMso="WindowSwitchWindowsMenuExcel" />
    </group>

    上述代码添加一个名为“My Sample”的自定义组,box元素用来组织控件的排列,separator元素用来放置分隔条。结果如图5所示: 
    RibbonX9-5
    图5:在自定义选项卡“Menu”中添加“My Sample”组,包含一些内置的功能

    <group id="rxDemo" label="My Menu">
    <menu id="rxMenu" label="Menu" imageMso="ReviewCompareMenu" size="large">
    <menu id="subMenu1" label="SubMenu1">
    <menu id="subMenu11" label="3-SubMenu1">
    <button id="rxMenu11" label="Up" imageMso="OutlineMoveUp" />
    <button id="rxMenu12" label="GoTo" imageMso="GoTo" />
    <button id="rxMenu13" label="Down" imageMso="OutlineMoveDown" />
    </menu>
    </menu>
    <menu id="subMenu2" label="SubMenu2">
    <menu id="subMenu21" label="3-SubMenu2">
    <button id="rxMenu21" label="Up" imageMso="OutlineMoveUp" />
    <button id="rxMenu22" label="GoTo" imageMso="GoTo" />
    <button id="rxMenu23" label="Down" imageMso="OutlineMoveDown" />
    </menu>
    </menu>
    <menuSeparator id="MySeparator" />
    <button id="rxMenuButton" label="Button" />
    </menu>
    </group>
    上述代码添加一个名为“My Menu”的组,其中放置了嵌套的层级菜单。结果如下图6所示:
    RibbonX9-6
    图6:在自定义选项卡“Menu”中添加“My Menu”组,包含层级菜单
    <group id="rxMyGroup" label="My Sample Group1">
    <button id="Button1" imageMso="HappyFace" size="large" label="BigButton" />
    <separator id="rxSeparator1" />
    <button id="b1" imageMso="HyperlinkInsert" size="large" label="Surf the Net" onAction="surf"/>
    <button id="b2" imageMso="HappyFace" label="Smile" onAction="smile"/>
    <button id="b3" imageMso="FormatPainter" label="Paint" onAction="paint"/>
    <button id="b4" imageMso="AutoFilterClassic" label="Filter" onAction="filter"/>
    </group>
    上述代码添加一个名为“My Sample Group1”的组,其中放置了一些带有内置图像的控件并进行了合理布局。结果如下图7所示:  

      RibbonX9-7

    图7:在自定义选项卡“Menu”中添加的“My Sample Group1”组,包含一些带有内置图像的控件
    <group id="rxMyGroup1" label="My Sample Group2">
    <toggleButton imageMso="TranslationToolTip" id="MyToggleButton" size="large" label="Insert My Object"/>
    <separator id="rxSeparator2" />
    <checkBox id="AllowChanges" label="Allow Changes" />
    <dropDown id="ChooseDepartment" showLabel="true" label="Choose Department">
    <item id="Dept1" label="Shipping" />
    <item id="Dept2" label="Accounting" />
    <item id="Dept3" label="Engineering" />
    </dropDown>
    <comboBox id="ComboBox1" label="ComboBox">
    <item id="item1" label="one" imageMso="_1" />
    <item id="item2" label="two" imageMso="_2" />
    <item id="item3" label="three" imageMso="_3" />
    </comboBox>
    </group>
    上述代码添加一个名为“My Sample Group2”的组,其中包含切换按钮、复选框、组合框、下拉框,并添加了项目。结果如图8所示:  
    RibbonX9-8
    图8:在自定义选项卡“Menu”中添加的“My Sample Group2”组,包含切换按钮、复选框、下拉框和组合框,并在其中添加了选项
    <contextualTabs>
    <tabSet idMso="TabSetChartTools" />
    </contextualTabs>
    上述代码添加上下文选项卡,当选中工作表中的图表时,会出现“图表工具”选项卡,如图9所示:  

       RibbonX9-9

    图9:选中图表后出现“图表工具”上下文选项卡 
    完整的代码 
    上述示例完整的XML代码如下:
    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
    <commands>
    <command idMso="FileSave" enabled="false" />
    </commands>
    <ribbon startFromScratch="true">
    <officeMenu>
    <button id="rxOMBtn1" label="My Office Button1" />
    <button id="rxOMBtn2" label="My Office Button2" />
    <menu id="MyOfficeMenu" label="My Office Menu">
    <button id="rxSend1" label="My Menu1" />
    <button id="rxSend2" label="My Menu2" />
    <button id="rxSend3" label="My Menu3" />
    <button id="rxSend4" label="My Menu4" />
    <button id="rxSend5" label="My Menu5" />
    <button id="rxSend6" label="My Menu6" />
    <button id="rxSend7" label="My Menu7" />
    <button id="rxSend8" label="My Menu8" />
    <button id="rxSend9" label="My Menu9" />
    </menu>
    </officeMenu>
    <qat>
    <sharedControls>
    <control idMso="Font" />
    </sharedControls>
    <documentControls>
    <control idMso="BordersGallery" />
    </documentControls>
    </qat>
    <tabs>
    <tab id="rxExcelVBA" label="Menu">
    <group idMso="GroupInsertChartsExcel" />
    <group id="rxAuditMisc" label="My Sample">
    <box id="rxSortBox">
    <control idMso="SortAscendingExcel" showLabel="false" />
    <control idMso="SortDescendingExcel" showLabel="false" />
    <control idMso="SortDialog" showLabel="false" />
    </box>
    <control idMso="Copy" />
    <control idMso="PasteMenu" />
    <separator id="rxAuditMiscSeparator1" />
    <control idMso="NameManager" />
    <control idMso="ViewFreezePanesGallery" />
    <control idMso="WindowSwitchWindowsMenuExcel" />
    </group>
    <group id="rxDemo" label="My Menu">
    <menu id="rxMenu" label="Menu" imageMso="ReviewCompareMenu" size="large">
    <menu id="subMenu1" label="SubMenu1">
    <menu id="subMenu11" label="3-SubMenu1">
    <button id="rxMenu11" label="Up" imageMso="OutlineMoveUp" />
    <button id="rxMenu12" label="GoTo" imageMso="GoTo" />
    <button id="rxMenu13" label="Down" imageMso="OutlineMoveDown" />
    </menu>
    </menu>
    <menu id="subMenu2" label="SubMenu2">
    <menu id="subMenu21" label="3-SubMenu2">
    <button id="rxMenu21" label="Up" imageMso="OutlineMoveUp" />
    <button id="rxMenu22" label="GoTo" imageMso="GoTo" />
    <button id="rxMenu23" label="Down" imageMso="OutlineMoveDown" />
    </menu>
    </menu>
    <menuSeparator id="MySeparator" />
    <button id="rxMenuButton" label="Button" />
    </menu>
    </group>
    <group id="rxMyGroup" label="My Sample Group1">
    <button id="Button1" imageMso="HappyFace" size="large" label="BigButton" />
    <separator id="rxSeparator1" />
    <button id="b1" imageMso="HyperlinkInsert" size="large" label="Surf the Net" onAction="surf"/>
    <button id="b2" imageMso="HappyFace" label="Smile" onAction="smile"/>
    <button id="b3" imageMso="FormatPainter" label="Paint" onAction="paint"/>
    <button id="b4" imageMso="AutoFilterClassic" label="Filter" onAction="filter"/>
    </group>
    <group id="rxMyGroup1" label="My Sample Group2">
    <toggleButton imageMso="TranslationToolTip" id="MyToggleButton" size="large" label="Insert My Object"/>
    <separator id="rxSeparator2" />
    <checkBox id="AllowChanges" label="Allow Changes" />
    <dropDown id="ChooseDepartment" showLabel="true" label="Choose Department">
    <item id="Dept1" label="Shipping" />
    <item id="Dept2" label="Accounting" />
    <item id="Dept3" label="Engineering" />
    </dropDown>
    <comboBox id="ComboBox1" label="ComboBox">
    <item id="item1" label="one" imageMso="_1" />
    <item id="item2" label="two" imageMso="_2" />
    <item id="item3" label="three" imageMso="_3" />
    </comboBox>
    </group>
    </tab>
    </tabs>
    <contextualTabs>
    <tabSet idMso="TabSetChartTools" />
    </contextualTabs>
    </ribbon>
    </customUI>
    自定义Excel界面如图10所示:  
    RibbonX9-10
    图10:自定义的Excel界面 看起来代码较多,其实并不复杂,如果大家有疑问,先不要着急,有概念就行,后面我们将慢慢详细地讲解。

     原文链接:http://www.360doc.com/content/09/1110/14/406571_8735933.shtml

  • 相关阅读:
    JQuery插件,轻量级表单模型验证(续 二)
    关于DateTimeOffset的爱恨情仇
    JQuery插件,轻量级表单模型验证(续 一)
    asp.net 远程模型验证
    JQuery插件,轻量级表单模型验证
    Ef Core增加Sql方法
    初识依赖注入
    Core下简易WebApi
    sql语句实现行转列练习
    sql语句基本查询操作
  • 原文地址:https://www.cnblogs.com/SanMaoSpace/p/2939459.html
Copyright © 2011-2022 走看看