【发布时间】:2012-03-30 16:21:08
【问题描述】:
已经有人问过here,但我对给出的答案不满意。
我目前正在向 Outlook 添加自定义上下文菜单。代码如下:
void Application_ItemContextMenuDisplay(Microsoft.Office.Core.CommandBar CommandBar, Microsoft.Office.Interop.Outlook.Selection Selection)
{
if (Online)
{
foreach (string category in FilingRuleManager.FilingRuleCategories)
{
Office.CommandBarPopup cb = CommandBar.Controls.Add(Office.MsoControlType.msoControlPopup, missing, missing, missing, true) as Office.CommandBarPopup;
cb.BeginGroup = true;
cb.Visible = true;
cb.Tag = MENUNAME;
cb.Caption = category;
//now add the filing rules as a sub menu
foreach (FilingRuleDB rule in FilingRuleManager.FilingRules.Values)
{
if (rule.RuleCategory == category)
{
Office.CommandBarButton cbSub = cb.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, missing, true) as Office.CommandBarButton;
_FilingRules.Add(cbSub);
cbSub.Visible = true;
cbSub.Caption = rule.RuleName;
cbSub.Tag = rule.FilingRuleID.ToString();
cbSub.Click += new Office._CommandBarButtonEvents_ClickEventHandler(FilingRules_Click);
}
}
}
}
}
当我运行应用程序时,每次我在 Outlook 中显示上下文菜单时,都会触发多次单击处理程序 (FilingRules_Click)。因此,如果我右键单击 3 次,则处理程序将执行 3 次,依此类推。
必须有比上面链接的问题中的破解更好的方法来实现这一点。
我试过了:
- 在添加命令栏按钮之前删除它们 - 但是它们不存在!!每次隐藏 Outlook 上下文菜单时,都会自动删除自定义项。
- 将控件存储在列表中,然后尝试删除处理程序 - 这会产生 AV,因为隐藏菜单后按钮不再存在。
- 没有可供我挂钩的 ItemContextMenuHidden() 事件,否则我会尝试这样做。
- 在加载项启动时添加项目(即仅在没有 ItemContextMenuDisplay() 处理程序的情况下添加一次),但是由于在显示菜单时它们总是被清除,因此这些项目永远不会出现。
有人有其他建议吗?
【问题讨论】:
标签: c# event-handling outlook-addin