C#Word开发,VSTO中自定义右键菜单,CommandBarButton的Click事件不触发,或者只触发一次

在做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;
        }

最后实现了我想要的目的。

猜你喜欢

转载自blog.csdn.net/loveyou388i/article/details/81013924
今日推荐