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

提示:您可以在评论中使用HTML标签,且任何与HTML标签相同的符号都会被理解为HTML标签并以相应的格式显示.如果您的评论中有代码,可以使用相应的标签,例如,如果有VB或VBA代码,则可以使用[vb]标签,即[vb]放置的代码[/vb],这样会很清晰地显示代码.

发表评论