从应用程序中删除命令栏按钮[“单元格”] 不会从事件ThisAddIn_Shutdown所有打开的工作簿中删除它们
本文关键字:单元格 删除 Shutdown 工作簿 ThisAddIn 按钮 命令 应用程序 事件 | 更新日期: 2023-09-27 18:33:32
我有一个带有 .NET 4.0 的 C# VSTO 应用程序,它在 Globals.ThisAddIn.Application.CommandBars["Cell"] 上下文菜单中使用两个自定义 CommandBarButtons。我在ThisAddIn_Startup事件上创建了一次按钮,它们对所有工作簿都非常有效。如果我的加载项在某个时候关闭而没有关闭 Excel,则如果打开的工作簿超过 1 个,则会出现问题。只有活动工作簿的右键单击上下文菜单删除了按钮。
代码:
public partial class ThisAddIn
{
private const string TAG_PASTE_EVENT = "PASTE EVENT";
private const string TAG_COPY_EVENT = "COPY EVENT";
private Office.CommandBarButton copy_event, paste_event;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
try
{
DefineShortcutMenu();
/*
* Other start up stuff that works fine
*/
}
catch (Exception ex)
{
ExceptionHandler.HandleException(ex);
}
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
/*
* Other shut down stuff that works fine
*/
// Remove the right click menu buttons
foreach (Office.CommandBarControl control in Application.CommandBars["Cell"].Controls)
{
if (control.Tag.Equals(TAG_PASTE_EVENT))
{
control.Delete(true);
}
else if (control.Tag.Equals(TAG_COPY_EVENT))
{
control.Delete(true);
}
}
}
private void copy_event_Click(Office.CommandBarButton Ctrl, ref bool CancelDefault)
{
// Copy code
}
private void paste_event_Click(Office.CommandBarButton Ctrl, ref bool CancelDefault)
{
// Paste code
}
private void DefineShortcutMenu()
{
// Create and add the paste button
paste_event = (Office.CommandBarButton)Application.CommandBars["Cell"].Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, 1, true);
paste_event.Style = Office.MsoButtonStyle.msoButtonCaption;
paste_event.Caption = "Paste Event";
paste_event.Tag = TAG_PASTE_EVENT;
paste_event.DescriptionText = "Stuff happens";
paste_event.Enabled = false;
paste_event.Click += paste_event_Click;
// Create and add the copy button
copy_event = (Office.CommandBarButton)Application.CommandBars["Cell"].Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, 1, true);
copy_event.Style = Office.MsoButtonStyle.msoButtonCaption;
copy_event.Caption = "Copy Event";
copy_event.Tag = TAG_COPY_EVENT;
copy_event.DescriptionText = "Stuff happens";
copy_event.Enabled = false;
copy_event.Click += copy_event_Click;
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}
我正在使用 Excel 2013,我知道它有一个与右键单击上下文菜单相关的错误(这就是为什么我对命令栏控件使用 foreach 而不是使用全局变量的原因(。您发现的任何工作流程将不胜感激!
澄清一下:一切正常,唯一的问题是如果加载项关闭,命令栏按钮不会从非活动工作簿的右键单击上下文菜单中删除。如果在同一会话期间重新打开"加载项",则所有工作簿都将再次获得"复制"和"粘贴"按钮,这意味着上下文菜单未正确更新的工作簿现在具有 2 个"复制"按钮和 2 个"粘贴"按钮。
命令
栏在 Office 2010 中已弃用。您需要改用 Fluent UI 控件。
有关详细信息,请参阅在 Office 2010 中自定义上下文菜单。