Logo

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

photo

2024年07月16日

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

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


橙子主题打折出售

其实我不卖,主要是这里是放广告的,所以就放了一个
毕竟主题都没做完,卖了也是坑.

购买它
所有附件
该文章没有附件.
本文为原创文章,请注意保留出处!

热门文章

Navicat Premium 12.0.22 安装与破解 一、安装  NavicatPremium12.0.22的下载链接:https://pan.ba...NavicatPremium12.0.22安装与破解 作者:Pastore Antonio
1515 浏览量
C# JArray与JObject 的使用 STEP1、usingNewtonsoft.Json.Linq;STEP2、如何获取json里的...C#JArray与JObject的使用 作者:Pastore Antonio
1465 浏览量
解决mysql的配置ONLY_FULL_GROUP_BY引起的错误 由于自己的本地网站环境使用了mysql8.0的版本,在测试一个groupby的sql查...解决mysql的配置ONLY_FULL_GROUP_BY引起的错误 作者:Pastore Antonio
1448 浏览量
Windows server 2016 英文服务器安装中文语言包教程 1、下载windowsserver2016语言包下载地址:https://pan.baidu....Windowsserver2016英文服务器安装中文语言包教程 作者:Pastore Antonio
1406 浏览量
assembly(全局程序集缓存)中dll的导入和导出 本文主要讲一下关于assembly中的dll是怎么导入和导出的。浏览量:1,468 作者:Pastore Antonio
1403 浏览量