IRibbonUI的Outlook功能区实现

时间:2017-07-03 05:14:35

标签: c# vb.net outlook outlook-addin ribbon

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

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

注意:此代码最初并非由我编写,但我的任务是修复解决方案..或者至少找到为什么这个东西不能按预期工作的原因。

无论如何,设置色带的方法在以下方法中定义: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

现在我感到困惑的是为什么Inspector的方法永远不会发生?当我单步执行代码时,甚至在打开检查器对象时,我的全局变量m_Ribbon有时为Nothing,反之亦然m_ERibbon变量。

有些时候m_ERibbon一无所有,有时候m_Ribbon一无所有......我开始认为我可能已经深深地误解了Ribbon for Office的工作方式。

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

我不明白的是:

  1. 为什么Ribbon_OnLoad一直没有开火,为什么ERibbon_OnLoad一直没有开火,尽管事实上我已经明确地设定onLoad方法来解雇这些方法?
  2. 为什么有m_ERibbonm_RibbonNothing的情况?
  3. 尽管我从Explorer或Inspector调用了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标记的片段(注意这是针对Inspector的):

    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"" " & _ 
    

1 个答案:

答案 0 :(得分:0)

Microsoft Office应用程序调用{​​{3}}方法以获取定义自定义功能区用户界面的XML字符串。

import numpy as np
values = np.array(arr)
searchval = ["81", "01"]
N = len(searchval)
possibles = np.where(values == searchval[0])[0]

solns = []
for p in possibles:
    check = values[p:p+N]
    if np.all(check == searchval):
        arr.pop(p+1)
        solns.append(p)

print(solns)

注意,有时您需要为作为参数传递的不同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

有关详细信息,请参阅GetCustomUI

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

请记住,默认情况下,如果VSTO加载项尝试操作Microsoft Office用户界面(UI)并失败,则不会显示任何错误消息。但是,您可以将Microsoft Office应用程序配置为显示与UI相关的错误的消息。您可以使用这些消息来帮助确定未显示自定义功能区的原因,或者为何显示功能区但未显示控件的原因。有关详细信息,请参阅Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)