2007 Office Fluent Ribbon定制用户指南(连载7)
其它应用程序的Ribbon定制方案
考虑下面列举修改Fluent UI方式的方案,可以进行修改以满足您的需要。
注意:为了在下面的部分演示Ribbon定制的行为,可以使用在本指南前面介绍的技术,详见“2007 Office Fluent Ribbon定制用户指南(连载2)”。
(一) 创建自定义解决方案
到目前为止,您已看到修改已存在Ribbon的每个示例,可以从头开始创建整个UI。如果想创建自已的UI并在Ribbon中设置自已的自定义布局,则可以进行这样的操作。如果设置Ribbon元素的startFromScratch属性为True,则隐藏Ribbon所有的内容(这样不需要手工隐藏每个功能区元素)。当设置startFromScratch属性为True时,将产生下面的变化:
- 隐藏所有已存在的Ribbon选项卡,包括加载项选项卡。
- 修改“Office按钮”菜单,仅包括新建、打开、保存、应用程序选项和退出命令。
注意:可以在XML标记文件中指定想要隐藏Office菜单中的控件。必须在XML标记中明确地通过设置特定控件的Visible属性为False来请求这些更改。隐藏这些命令可能会将应用程序陷入不可恢复的状态,仅能通过关闭应用程序并卸载您的解决方案来解决。
设置startFromScratch属性不会对状态栏产生影响。
下面简单的XML标记使用startFromScratch属性来定制Fluent UI。
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui” >
<ribbon startFromScratch=”true” >
<tabs>
<tab id=”CustomTab” label=”My Tab” >
<group id=”SimpleControls” label=”My Group”>
<toggleButton id=”ToggleButton1″
size=”large” label=”Large Toggle Button”/>
<button id=”Button2″ label=”My Button ” />
<comboBox id=”Combo1″ label=”ComboBox”>
<item id=”Month1″ label=”January” />
<item id=”Month2″ label=”February” />
<item id=”Month3″ label=”March” />
</comboBox>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
这个示例隐藏Fluent UI中所有内置组件,并使用一个自定义选项卡、一个组和不同的控件来取代。
(二) 显示和隐藏选项卡
可以使用如下所示的示例标记来显示或隐藏内置选项卡或自定义选项卡。
<tab idMso=”TabHome” visible=”false” />
如果想要编程确定是否显示或隐藏选项卡(或其它元素),可以提供一个回调过程。也就是说,可以定义元素像下面的XML:
<tab idMso=”TabInsert” getVisible=”getVisibleCallback” />
接下来,在加载项或在VBA代码里,可以提供一个过程来返回Boolean值,指示是否该项目是可见的。例如,可以使用如下所示的代码在周末时隐藏Word 2007中的“插入”选项卡。
Public Sub getVisibleCallback(control As IRibbonControl, _
ByRef visible As Variant)
Select Case DatePart(”w”, Date)
Case vbSaturday, vbSunday
visible = False
Case Else
visible = True
End Select
End Sub
(三) 显示和隐藏组
可以使用下面的示例代码(与以前示例中的回调过程一起使用)来显示或隐藏内置组或自定义组。
<tab idMso=”TabView”>
<group idMso=”GroupDocumentViews” visible=”false” />
<group id=”MyCustomGroup” label=”Custom Group”
getVisible=”getVisibleCallback” />
</tab>
(四) 添加自定义选项卡
可以使用下面的代码来添加自定义选项卡。
<tab id=”CustomTab” label=”My Tab” />
(五) 添加带控件的自定义组
可以使用下面的示例代码添加一个自定义组,然后添加内置控件。
<group id=”CustomGroup” label=”My Group”>
<toggleButton idMso=”Italic” />
<toggleButton idMso=”Bold” />
<button idMso=”FileSave” />
</group>
可以使用下面的代码添加自定义组,然后添加自定义控件。
<group id=”CustomGroup” >
<toggleButton id=”MyToggleButton” size=”large”
label=”Insert My Object”/>
<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>
</group>
(六) 创建带嵌套菜单和控件的自定义菜单
可以使用下面的代码示例创建自定义菜单,然后添加嵌套的内置菜单和控件和自定义菜单和控件。这段标记也包括两个菜单分隔条。
<menu id=”MyMenu” label=”Test Menu” itemSize=”normal”>
<toggleButton idMso=”Bold”/>
<button id=”MenuButton1″ label=”Button1″ />
<menuSeparator id=”separator1″/>
<toggleButton id=”MenuToggleButton1″ label=”ToggleButton” />
<button idMso=”FileExit”/>
<menu id=”Nested1″ label=”Advanced” itemSize=”normal”>
<button idMso=”Cut”/>
<button idMso=”Copy”/>
<button idMso=”Paste”/>
<menuSeparator id=”separator2″ title=”Large Buttons Below”/>
<menu id=”Nested2″ label=”Large” itemSize=”large”>
<button idMso=”Cut”/>
<button idMso=”Copy”/>
<button idMso=”Paste”/>
</menu>
</menu>
</menu>
(七) 添加带嵌套项的组合框或下拉框
可以使用下面的代码示例来添加带项目的内置组合框控件(下拉控件使用相同的语法)。
<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>
(八) 添加带项目的自定义库控件
可以使用下面的代码示例添加带项目的库控件,然后添加自定义按钮控件。
<gallery id=”MonthGallery” imageMso=”DateAndTimeInsert”
label=”Pick a Month:” columns=”3″ rows=”4″ onAction=”InsertMonth” >
<item id=”Month1″ label=”January”/>
<item id=”Month2″ label=”February”/>
<item id=”Month3″ label=”March”/>
<item id=”Month4″ label=”April”/>
<item id=”Month5″ label=”May”/>
<item id=”Month6″ label=”June”/>
<item id=”Month7″ label=”July”/>
<item id=”Month8″ label=”August”/>
<item id=”Month9″ label=”September”/>
<item id=”Month10″ label=”October”/>
<item id=”Month11″ label=”November”/>
<item id=”Month12″ label=”December”/>
<button id=”InsertMonthButton”
label=”Insert current month” onAction=”InsertCurrentMonth”/>
</gallery>
下面的VBA过程为库项目和库中的按钮提供了回调行为。
Sub InsertMonth(control As IRibbonControl, _
selectedId As String, selectedIndex As Integer)
Dim text As String
Select Case control.ID
Case “MonthGallery”
text = MonthName(selectedIndex + 1)
End Select
Selection.InsertAfter text
End Sub
Sub InsertCurrentMonth(control As IRibbonControl)
Select Case control.ID
Case “InsertMonthButton”
text = MonthName(DatePart(”m”, Date))
End Select
Selection.InsertAfter text
End Sub
注意:当定义库时,所有项目元素必须出现在任何按钮元素之前。
可以通过使用回调在运行时填充库控件。可以使用getItemCount回调来确定显示的项目数,getItemHeight和getItemWidth回调来获取库中项目的高度和宽度,getItemImage和getItemLabel回调来获取每个项目的图像和标签,getSelectedItemID或getSelectedItemIndex回调来获取所选的ID或索引值。
(九) 动态填充下拉列表
可以直到运行前都不知道在Ribbon控件中显示哪些项目,回调使得基于当前条件提供值成为可能。例如,可能想要显示文档标题列表,下面的示例演示如何提供当前文档标的列表。
包括下面的控件在Ribbon定制中。
<dropDown id=”HeadingsDropDown”
getItemCount=”GetItemCount”
getItemID=”GetItemID”
getItemLabel=”GetItemLabel”/>
接下来,在代码中(在本例中Word文档的VBE模块里)添加下面的回调过程。
Sub GetItemCount(control As IRibbonControl, ByRef count)
Dim varItems As Variant
varItems = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)
count = UBound(varItems)
End Sub
Sub GetItemLabel(control As IRibbonControl, index As Integer, _
ByRef label)
Dim varItems As Variant
varItems = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)
label = varItems(index + 1)
End Sub
Sub GetItemID(control As IRibbonControl, index As Integer, ByRef ID)
ID = “heading” & index
End Sub
现在,当打开下拉列表时,将显示文档中所有的标题。
(十) 组合单个的控件
缺省情况下,Ribbon确定添加到组中的控件的位置。如果想要更精确地定义控件的布局,可以在一个或多个框里组合控件。当创建一个框时,指定其方向(水平的或垂直的)。一个组可以包含多个框,可以在框之间包括垂直分隔。(通过使用separator控件创建垂直分隔,仅用于垂直框。)
下面的示例创建三个组,一个使用水平框,一个使用垂直框,还有一个没有框,如下图所示。
<group id=”CustomGroup1″ label=”Horizontal Boxes”
insertBeforeMso=”GroupClipboard”>
<box id=”box1″ boxStyle=”horizontal”>
<button id=”buttonA1″ label=”Button1″/>
<button id=”buttonA2″ label=”Button2″/>
</box>
<box id=”box2″ boxStyle=”horizontal”>
<button id=”buttonAA” label=”ButtonA”/>
<button id=”buttonAB” label=”ButtonB”/>
<button id=”buttonAC” label=”ButtonC”/>
</box>
</group>
<group id=”CustomGroup2″ label=”Vertical Boxes”
insertBeforeMso=”GroupClipboard”>
<box id=”box3″ boxStyle=”vertical”>
<button id=”buttonB1″ label=”Button1″/>
<button id=”buttonB2″ label=”Button2″/>
</box>
<separator id=”separator2″/>
<box id=”box4″ boxStyle=”vertical”>
<button id=”buttonBA” label=”ButtonA”/>
<button id=”buttonBB” label=”ButtonB”/>
<button id=”buttonBC” label=”ButtonC”/>
</box>
</group>
<group id=”CustomGroup3″ label=”No Boxes”
insertBeforeMso=”GroupClipboard”>
<button id=”buttonC1″ label=”Button1″/>
<button id=”buttonC2″ label=”Button2″/>
<button id=”buttonCA” label=”ButtonA”/>
<button id=”buttonCB” label=”ButtonB”/>
<button id=”buttonCC” label=”ButtonC”/>
</group>

图:不同的框样式
