2017-07-03 30 views
0

我对Outlook对象模型中公开的IRibbonUI接口的实现感到困惑。IRibbonUI的Outlook功能区实现

当编写Explorer或Inspector功能区的XML文件时,我们必须定义哪个方法负责将XML加载到Outlook中。

注:此代码最初不是我写的,但我一直在负责固定在至少solution..or找到原因,如预期这个东西不起作用。

不管怎么说,设置丝带方法在下面的方法定义:Ribbon_OnLoadERibbon_OnLoad

Public Sub Ribbon_OnLoad(ByVal Ribbon As Office.IRibbonUI) 
     m_Ribbon = Ribbon 
    End Sub 

    Public Sub ERibbon_OnLoad(ByVal Ribbon As Office.IRibbonUI) 
     m_ERibbon = Ribbon 
    End Sub 

现在我很困惑就是为什么在检查方法不会触发?当我遍历代码,甚至当我打开一个检查器对象时,我的全局变量m_Ribbon有时是Nothing,反之亦然m_ERibbon变量。

有些时候m_ERibbon什么都没有,并且曾经有过m_Ribbon一直没有。我开始认为我可能深深地误解了Ribbon for Office的工作原理。

现在,当我必须通过Invalidate方法调用回调时,它变得更加复杂。我有一个资源管理器包装和一个检查器包装,根据用户是否使用Explorer或Inspector调用m_ERibbon.Invalidate()m_Ribbon.Invalidate()

我不明白的是:

  1. 为什么不Ribbon_OnLoad火的时候,为什么不ERibbon_OnLoad火的时候,尽管我已经显式地设置onLoad方法发射这些方法?
  2. 为什么有这种情况m_ERibbonm_RibbonNothing

从我可以讲的是,尽管从资源管理器或检查...调用Invalidate()调用所有尽管有一些回调的回调被调用的方法Invalidate()被放置在检查,反之亦然。

我理解错了吗?

编辑我添加了GetCustomUI的代码,因为这是定义标记的地方。尽管Explorer和Inspector都有相应的XML标记,方法Ribbon_OnLoad(对于检查员)不会触发。

Function GetCustomUI(ByVal RibbonID As String) As String Implements Microsoft.Office.Core.IRibbonExtensibility.GetCustomUI 
    Select Case RibbonID 
     Case "Microsoft.Outlook.Mail.Read" 
      Return basRibbon.QFGetRibbonMailRead() 
     Case "Microsoft.Outlook.Explorer" 
      Return basRibbon.GetRibbonExplorerFolder() 
     Case Else 
      Return String.Empty 
    End Select 
End Function 

和XML标记的一个片段如下(注意,这是对督察):

sRibbonXML = "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui"" onLoad=""Ribbon_OnLoad"" >" & _ 

代码段为浏览器的XML标记:

sRibbonXML = "<customUI xmlns=""http://schemas.microsoft.com/office/2009/07/customui"" onLoad=""ERibbon_OnLoad"" " & _ 

回答

0

Microsoft Office应用程序调用GetCustomUI方法来获取定义您的自定义功能区的用户界面的XML字符串。

public class Connect : Object, Extensibility.IDTExtensibility2, IRibbonExtensibility 
... 

public string GetCustomUI(string RibbonID) 
{ 

    StreamReader customUIReader = new System.IO.StreamReader("C:\\RibbonXSampleCS\\customUI.xml"); 

    string customUIData = customUIReader.ReadToEnd(); 

    return customUIData; 
} 

注意,有时你需要返回的XML标记为作为参数传递不同ribbonID值。在这种情况下,您将得到onLoad回调(对于检查员)。

public string GetCustomUI(string ribbonID) 
    { 
     string ribbonXML = String.Empty; 

     if (ribbonID == "Microsoft.Outlook.Mail.Compose") 
     { 
      ribbonXML = GetResourceText("Trin_RibbonOutlookBasic.Ribbon1.xml"); 
     } 

     return ribbonXML; 
    } 

查看Customizing a Ribbon for Outlook了解更多信息。

您可以在MSDN中的以下系列文章阅读更多有关Fluent用户界面(又名的Ribbon UI):

请记住,默认情况下,如果VSTO加载项尝试操作Microsoft Office用户界面(UI)并失败,则不会显示错误消息。但是,您可以配置Microsoft Office应用程序以显示与UI相关的错误消息。您可以使用这些消息来帮助确定为什么不显示自定义功能区,或者为什么显示功能区但不显示控件。有关更多信息,请参阅How to: Show Add-in User Interface Errors

+0

尤金,谢谢你的回复。请参阅我编辑的答案,我已经添加了“GetCustomUI”方法的代码和用于构建功能区的XML标记的片段。奇怪的是'Ribbon_OnLoad'不会为检查员启动。 –

+0

请注意,您不处理组成项目。只提及只读检查员。你有没有在Outlook中的任何用户界面错误? –

+0

在生产代码中,我处理组合物品;但是我在上面的例子中省略了它们。我没有从Outlook中获取任何UI错误。从我注意到的情况来看,在XML标记中定义的'onLoad'方法只会触发一次,无论哪个对象,Outlook首先获取Explorer还是Inspector。如果我错了,请纠正我的错误? –