在 运行 时间添加到 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 在以下文章中有深入的描述:
- Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3)
- Customizing the 2007 Office Fluent Ribbon for Developers (Part 2 of 3)
- Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)
此外,您可能会发现 Walkthrough: Create a custom tab by using Ribbon XML 有帮助。请注意,您可以将现有的自定义功能区 UI 导出到 XML 并继续处理原始标记。
您好,我正在尝试将当前打开的联系人 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 在以下文章中有深入的描述:
- Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3)
- Customizing the 2007 Office Fluent Ribbon for Developers (Part 2 of 3)
- Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)
此外,您可能会发现 Walkthrough: Create a custom tab by using Ribbon XML 有帮助。请注意,您可以将现有的自定义功能区 UI 导出到 XML 并继续处理原始标记。