我为Outlook编写了一个VSTO加载项。加载项的关键是在用户回复电子邮件时在功能区上放置一个按钮,以便他们快速将电子邮件敏感度设置为机密或恢复为正常。目前,在电子邮件上执行此操作的过程是多个步骤,我的客户希望只需单击一下即可。根据当前电子邮件的敏感度,按钮图标为红色或绿色。
灵敏度=正常=>红色按钮
敏感度=机密=>绿色按钮
我发现了一些基本用例:
我选择完成此操作的方式是使用功能区XML中的两个按钮覆盖getVisible属性,并根据当前MailItem设置可见的相应按钮。另一种方法是使用一个按钮并根据MailItem灵敏度属性切换图像和功能。
无论我的选择如何,我认为我会遇到同样的问题,因为Office Ribbon是一个静态对象,在创建Explorer或Inspector时绘制一次,你需要通过调用InvalidateUI来强制重绘方法
考虑到这一点,为了覆盖我上面的3个用例,我不得不从应用程序中查看一些事件。
我不确定我是否可以发布确切的代码,但其基础知识如下:
On Startup subscribe to:
Application.ActiveExplorer().SelectionChange
Application.Inspectors.NewInspector
On SelectionChange
If there is one item selected, and that one item is a MailItem
Refresh the Ribbon UI - Call Ribbon.InvalidateUI();
On NewInspector
If the Inspector.CurrentItem is a MailItem
Refresh the Ribbon UI - Call Ribbon.InvalidateUI();
SelectionChange事件处理程序涵盖用户是否在Outlook 2013中向上点击并选择内联草稿。它将在TabSet TabComposeTools,TabMessage中绘制功能区。这会在必要时将图标放在主外观窗口功能区上。
NewInspector事件处理程序涵盖用户是否双击草稿,创建新窗口。
我一直在收到有关Outlook崩溃的报告。起初我的日志记录有限,并且依赖于Outlook生成的事件日志。 不是很有帮助。
然后我实现了log4Net,我正在写入用户配置文件的AppData文件夹中的日志文件。 这给了我一些见解
我在每个方法代码块周围都包含了一个try / catch,所以我的加载项中没有任何内容(我写的)在try / catch之外运行,每个块只捕获异常,记录它并抛出它。 这是尝试找到问题。
我的最新日志显示了UI刷新,所以它调用了我的GetVisibility覆盖,基于如果control.Context是Explorer或Inspector我将ActiveInlineResponse或CurrentItem作为MailItem,读取Sensitivity属性并基于此如果调用处理程序的按钮应该可见,则返回True或False。 (我有两个按钮的处理程序)
当我将ActiveInlineResponse转换为MailItem时,似乎发生了崩溃。我日志中的下一个项目是我在Addin的Startup处理程序中执行的日志记录。 (因此用户重新启动了Outlook)
我已经将一些事件处理程序局部变量放入我的加载项类中,如https://www.experts-exchange.com/questions/27305112/Problem-with-VSTO-event-handler-going-out-of-scope-in-Outlook-AddIn.html所描述的那样我没有看到错误,但也没有得到太多反馈,因为我在星期五这样做了而这个星期一是假期。如果这似乎是“修复”,我会更新答案。