在 运行 时间添加到 Ribbon 一次有效

Adding to Ribbon at run time works once

您好,我正在尝试将当前打开的联系人 phone 个号码添加到功能区。

我创建了功能区并添加了一个包含 phone 数字的 SplitButton。

在 'ThisAddin' 中,当当前资源管理器发生更改时,它会触发一个事件,该事件仅获取项目类型。如果是联系人,它会调用

//ThisAddin.cs on explorer change event - if is contact run:    

Globals.Ribbons.CallContact.AddButton(contactItem.BusinessTelephoneNumber);  



//Ribbon class
internal void AddButton(string name)
    {            
        if (name != null && name.Count() > 2)
        {
            RibbonButton item = Globals.Factory.GetRibbonFactory().CreateRibbonButton();
            item.Label = name;
            item.ShowLabel = true;
            this.newSplit.Items.Add(item);
        }
    }

这一次有效,第一次打开联系人时,phone 号码显示在功能区中。打开另一个联系人 window 将导致功能区项被添加但为空且为空。

我只是想将联系人 phone 号码添加到功能区并将它们留在那里,而用户可以打开另一个联系人并且运行相同的代码将 phone 号码添加到功能区.

添加项目后,我不需要保留对项目的引用。感谢您的帮助。我觉得这里某处需要调用。

您必须告诉 Outlook 刷新功能区。请参阅 https://docs.microsoft.com/en-us/visualstudio/vsto/walkthrough-updating-the-controls-on-a-ribbon-at-run-time?view=vs-2019 示例代码。

您需要指定一个回调来检索按钮的标题,而不是 hard-coding 在功能区的 XML。

请注意,由于您可以打开多个检查器,因此您必须提供在其自己的检查器中打开的每个项目的特定数据。

功能区 UI 是静态的,因为它在启动时加载一次(或在显示 window 之前)。你能做的最好的事情就是定义回调并在你需要的任何地方调用它们。例如,您可以为功能区控件定义 'getVisible' 回调,而不是在运行时添加新元素。

IRibbonUI.Invalidate 方法使功能区用户界面的所有控件的缓存值无效。

您可以使用 COM 加载项中的回调过程自定义功能区 UI。对于加载项实现的每个回调,都会缓存响应。

例如,如果插件编写器为按钮实现了 getImage 回调过程,则调用该函数一次,加载图像,然后如果需要更新图像,则使用缓存的图像而不是回顾程序。此过程保持原样,直到加载项使用 Invalidate 方法发出缓存值无效的信号,此时再次调用回调过程并缓存 return 响应。然后,加载项可以通过调用 Refresh 方法强制立即更新 UI。

<customUI … OnLoad="MyAddinInitialize" …>


Dim MyRibbon As IRibbonUI 

Sub MyAddInInitialize(Ribbon As IRibbonUI) 
 Set MyRibbon = Ribbon 
End Sub 

Sub myFunction() 
 MyRibbon.Invalidate() ' Invalidates the caches of all of this add-in's controls 
End Sub

Fluent UI 在以下文章中有深入的描述:

此外,您可能会发现 Walkthrough: Create a custom tab by using Ribbon XML 有帮助。请注意,您可以将现有的自定义功能区 UI 导出到 XML 并继续处理原始标记。