在做VSTO开发时,对右键菜单进行自定义,添加自定义按钮。
新建按钮代码如下:
/// <summary>
/// 初始化自定义弹出菜单
/// </summary>
private void InitPopupMenu()
{
var textBar = OfficeCore.App.CommandBars["Text"];
textBar.Reset();
//添加书签
if (textBar.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, missing, true) is CommandBarButton button)
{
button.Tag = "AddBookMark";
button.Caption = "添加书签";
button.Style = Microsoft.Office.Core.MsoButtonStyle.msoButtonIconAndCaption;
button.Visible = false;
button.Cilck += AddBmButtonOnClick;
OfficeCore.BtnAddBm = button.accName;
}
}
private void AddBmButtonOnClick(CommandBarButton ctrl, ref bool cancelDefault)
{
//具体操作
}
后面发现点击按钮时并没有触发事件,打了断点也没有命中断点。
一顿操作还是没办法解决问题。
后面仔细对比网络上的资料和自己的代码,发现了一个差异。
资料上新建按钮,都是在Application.WindowBeforeRightClick内新建的,因此没有出现这个问题。而我则是在ThisAddIn_Startup内调用了InitPopupMenu新建按钮并添加事件的。
尝试将InitPopupMenu放在WindowBeforeRightClick函数内,发现可以触发Click事件了。
为了不重复新建按钮,因此我将新建按钮与按钮事件订阅分离,在ThisAddIn_Startup内新建按钮,在WindowBeforeRightClick内订阅事件(先取消订阅再订阅)
代码如下:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
OfficeCore.App.WindowBeforeRightClick += AppOnWindowBeforeRightClick;
InitPopupMenu();
}
private void InitPopupMenu()
{
var textBar = OfficeCore.App.CommandBars["Text"];
textBar.Reset();
//添加书签
if (textBar.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, missing, true) is CommandBarButton button)
{
button.Tag = "AddBookMark";
button.Caption = "添加书签";
button.Style = Microsoft.Office.Core.MsoButtonStyle.msoButtonIconAndCaption;
button.Visible = false;
OfficeCore.BtnAddBm = button.accName;
}
}
private void AppOnWindowBeforeRightClick(Word.Selection sel, ref bool cancel)
{
var textBar = OfficeCore.App.CommandBars["Text"];
var BtnAddBm = textBar.Controls[OfficeCore.BtnAddBm] as CommandBarButton;
//令人作呕的机制
BtnAddBm.Click -= AddBmButtonOnClick;
BtnAddBm.Click += AddBmButtonOnClick;
}
最后实现了我想要的目的。