2011-09-07 180 views
2

我们建立一个自定义上下文菜单当你右击邮件在Outlook中像这样:C#的Outlook加载项 - 右键菜单处置

 private void _application_ItemContextMenuDisplay(Office.CommandBar CommandBar, Interop.Selection Selection) 
     { 
       var contextButton = (Office.CommandBarButton)CommandBar.Controls.Add(Office.MsoControlType.msoControlButton, Temporary: true); 
       contextButton.Visible = true; 
       contextButton.Caption = "&My Context Menu"; 
       contextButton.Click += MyContextMenu_Click; 
     } 

此方法订阅Application.ItemContextMenuDisplay

它工作正常,除了偶尔我们的事件被多次解雇。当您在不同的电子邮件上快速右键单击时会发生这种情况。

然后它让我想知道,什么时候清理我的临时上下文菜单项是一个好地方?我需要取消订阅某处的C#事件。预期的地方在哪里做? (我也认为我们可能需要拨打Marshal.ReleaseComObject

我们在Visual Studio中使用VSTO和Outlook 2010项目模板。一般来说,我还没有找到很多自定义上下文菜单的好例子。

回答

1

这个怪癖可能是为什么在Outlook 2010中,微软正朝着Ribbon XML context menu customizations转移,转而采用Outlook 2007风格的CommandBars。见related SO post

至于清理CommandBars使用的资源,您需要附加到Application.ContextMenuClose事件以释放资源并取消订阅您的监听器。见related SO post on disposing Outlook Context Menus

您应该重构代码以利用较新的Ribbon XML接口来避免CommandBars

+0

我们发现这个事件没有像预期的那样被解雇(我想是因为它是列表中联系人或电子邮件的菜单)。我不再在这个问题上工作 - 我们最终在'ItemContextMenuDisplay'的开头清理了旧的菜单。这对我们非常有用。 – jonathanpeppers