2007 Office Fluent Ribbon定制用户指南(连载16)
问题13:我的Microsoft Office Access 2003解决方案隐藏了所有的Access菜单和工具栏,并显示自定义菜单和工具栏。当用户在Access 2007中打开该解决方案时会发生什么?我的自定义菜单和工具栏会显示在加载项选项卡中吗?
当Access 2003应用程序中包括对隐藏菜单和工具栏的设置时,Access 2007能够发现,并且仅显示自定义菜单和工具栏。本例中,Access 2007不会在加载项选项卡中显示自定义菜单和工具栏。
问题14:附加的Ribbon定制XML如何在Access 2007中工作?可以在数据库中存储自定义UI吗?如果要这样做,如何做?
因为Access数据库没有执行新的Office Open XML格式文件结构,在Access中VBA通常在数据库的表中存储其标记。创建名为USysRibbons的表,存储两列(RibbonName,一个255字符的字段和RibbonXml,一个说明字段),包含名称和标记。然后通过使用选项对话框从表中的名称选择Ribbon。也可以使用标准的数据操作技术来读取表中的XML内容,并调用Application.LoadCustomUI方法来应用新的Ribbon内容。可以在Microsoft Office Developer Center: Ribbon中找到更详细的信息。
问题15:当两个加载项试图重复使用相同的内置控件时会发生什么?
最后试图利用控件的加载项成为活动加载项。
问题16:可以编程从内置的库中删除项目吗?
不能通过使用RibbonX编程从内置的库中删除项目,可以使用应用程序的对象模型来删除它们。
问题17:可以编程自定义快速访问工具栏吗?至少在start-from-scratch方案中。
是的,可以通过设置Ribbon元素的startFromScratch属性为True为定制快速访问工具栏。但是,建议不要定制快速访问工具栏,除非有一个好的理由。
问题18:如何局部化我的UI?
有两种方式。如果使用COM,可以基于当前的UI语言返回不同的XML文件。如果使用VBA,可以为每一语言有多个VBA文件,或者有一个回调返回所有控件的合适的标签。
问题19:可以删除Office按钮吗?
可以禁用或隐藏Office按钮菜单中的所有项目,但是不能删除按钮自身。
问题20:如何编写使用在Ribbon中的VBA加载项,但也可以使用在Office 2003应用程序的命令栏中?
可以创建一个VBA文档,使用Office 2003和2007 Microsoft Office system的功能。一种是通过使用Application.Version检查Office版本,如果其值小于12(2007 Office应用程序),运行命令栏代码,通过转换器忽略Ribbon XML标记使得在2007 Office应用程序中创建的文档可以在Office 2003应用程序打开。如果其值为12,则不需要做任何特别的处理。包含Ribbon XML标记的文件将被装载,并且回调也成为可用的。
问题21:不可以使用RibbonX控件状态栏,但如何编程来隐藏状态栏呢?
可以使用下面的代码来隐藏状态栏。
Application.CommandBars(”Status Bar”).Visible = False
问题22:如何创建两个添加项目到相同组或选项卡中的加载项?
控件的idQ属性可以使多个加载项到共享的容器文件,例如自定义选项卡和组。
在下面的VBA示例中,两个Excel加载项共享加载项选项卡中相同的“Contoso”组,每个加载项在其中添加一个按钮。实现该操作的关键是在<CustomUI>标签中指定相同的独立的命名空间,然后,控件能通过使用idQ来引用这个命名空间。
(1) 加载项1
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui” xmlns:x=”myNameSpace” >
<ribbon>
<tabs>
<tab idMso=”TabAddIns”>
<group idQ=”x:Contoso” label=”Contoso”>
<button id=”C1″ label=”Contoso Button 1″ size=”large” imageMso=”FileSave” onAction=”c_action1″ />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
(2) 加载项2
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui” xmlns:x=”myNameSpace” >
<ribbon>
<tabs>
<tab idMso=”TabAddIns”>
<group idQ=”x:Contoso” label=”Contoso”>
<button id=”C2″ label=”Contoso Button 2″ size=”large” imageMso=”FileSave” onAction=”c_action2″ />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
如果使用COM加载项来自定义Ribbon,则命名空间的名称必须是COM加载项的ProgID。当使用某共享的加载项时,ProgID是AddInName.Connect;当使用Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System(Visual Studio 2005 Tools for Office Second Edition)来创建加载项时,ProgID是该加载项的名称。
问题23:如何为我的控件赋予KeyTips?
KeyTips是在按下ALT键后显示在Ribbon中的键盘快捷键,可以通过使用KeyTip属性和getKeytip属性来赋自已的KeyTips。(getKeytip属性提供与KeyTip相同的回调过程名称)。
注:如果KeyTips与内置的控件或其它加载项的KeyTips相冲突,则它们会被自动地赋予非冲突的值。对于组的KeyTips,作为一条规则,应该以字母Z开始。
问题24:(仅VBA)如果两个文档有相同的回调签名,则从活动文档调用回调。如何确保我的UI仅调用与我的文档相关联的回调?
这也是一个在Office 2003中存在的问题。作为一个工作区,可以通过添加加载项或解决方案名称到回调名中使回调名是唯一的,也可以将回调放置在模块中,然后通过使用过程的全名来指向回调。例如,如果将回调放置在名为“MyAddInXYZ”的模块中,则可以通过使用“MyAddInXYZ.myCallback”来指向回调。
问题25:可以从VBA中与Ribbon控件相交互吗?
Application.CommandBars类提供了下面与Ribbon控件相交互的方法。
表:Application.CommandBars类的方法
| 方法 | 描述 |
|---|---|
| Sub ExecuteMso(idMso As String) | 执行在idMso中指定的命令 |
| Function GetImageMso(idMso As String, Width As Long, Height As Long) As IPictureDisp | 返回在idMso中指定的命令的图像,调整大小到指定的Width和Height (与Office 2003中的图片和遮罩相似) |
| Function GetLabelMso(idMso As String) As String Function GetLabelMso(idMso As String) As String Function GetLabelMso(idMso As String) As String |
以String返回所请求的控件的类型 |
| Function GetEnabledMso(idMso as String) as Boolean Function GetEnabledMso(idMso as String) as Boolean Function GetVisibleMso(idMso as String) as Boolean |
以Boolean值返回内置控件的状态 |
问题26:如何确定不同应用程序中功能区的Ribbon ID?
下表列出了不同应用程序中的Ribbon IDs,每个应用程序在IRibbonExtensibility接口的getCustomUI方法中传递该ID到解决方案中。这使得应用程序(或加载项)来确定哪个应用程序来装载代码,并且根据宿主应用程序可以返回不同的XML内容设置。
表:应用程序的Ribbon IDs
| 应用程序 | Ribbon ID |
|---|---|
| Access | Microsoft.Access.Database |
| Excel | Microsoft.Excel.Workbook |
| PowerPoint | Microsoft.PowerPoint.Presentation |
| Word | Microsoft.Word.Document |
| Outlook | Microsoft.Outlook.Mail.Read Microsoft.Outlook.Mail.Compose Microsoft.Outlook.MeetingRequest.Read Microsoft.Outlook.MeetingRequest.Send Microsoft.Outlook.Appointment Microsoft.Outlook.Contact Microsoft.Outlook.Journal Microsoft.Outlook.Task Microsoft.Outlook.DistributionList Microsoft.Outlook.Report Microsoft.Outlook.Resend Microsoft.Outlook.Response.Read Microsoft.Outlook.Response.Compose Microsoft.Outlook.Response.CounterPropose Microsoft.Outlook.RSS Microsoft.Outlook.Post.Read Microsoft.Outlook.Post.Compose Microsoft.Outlook.DistributionList Microsoft.Outlook.Report Microsoft.Outlook.Resend Microsoft.Outlook.Response.Read Microsoft.Outlook.Response.Compose Microsoft.Outlook.Response.CounterPropose Microsoft.Outlook.Response.CounterPropose Microsoft.Outlook.RSS Microsoft.Outlook.Post.Read Microsoft.Outlook.Post.Compose Microsoft.Outlook.Sharing.Read Microsoft.Outlook.Sharing.Compose |

发表评论