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

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


橙子主题打折出售

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

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

热门文章

WordPress 后台编辑器样式实现直接预览 在WordPress3.0以后,有一个新的实用功能:你可以更改默认后台编辑器(TinyMCE)的样...WordPress后台编辑器样式实现直接预览 作者:Pastore Antonio
1451 浏览量
【干货】Chrome插件(扩展)开发全攻略 写在前面我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的...【干货】Chrome插件(扩展)开发全攻略 作者:Pastore Antonio
1417 浏览量
CentOS 编译错误+配置错误解决方法集合 ERROR:theHTTPXSLTmodulerequiresthelibxml2/l...CentOS编译错误+配置错误解决方法集合 作者:Pastore Antonio
1409 浏览量
WordPress中加载JavaScript脚本的方法 在WordPress中加载脚本(为CSS和JS,下同)文件,大多数人的做法是直接在hea...WordPress中加载JavaScript脚本的方法 作者:Pastore Antonio
1386 浏览量
wordpress学习五: 通过wordpress_xmlrpc的python包远程操作wordpress wordpress提供了丰富的xmlrpc接口api来供我们远程操控wp的内容。伟大的开源社区有人就...wordpress学习五:通过wordpress_xmlrpc的python包远程操作wordpress 作者:Pastore Antonio
1384 浏览量