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
1533 浏览量
【干货】Chrome插件(扩展)开发全攻略 写在前面我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的...【干货】Chrome插件(扩展)开发全攻略 作者:Pastore Antonio
1488 浏览量
memcached 处理 多端口:https://blog.csdn.net/Erica_1230/article/deta...memcached处理 作者:Pastore Antonio
1481 浏览量
使用Nginx+WordPress搭建个人网站 背景很多研究技术的朋友喜欢写博客。如果希望搭建一个完全属于自己的网站,也并不困难。这里简要分享一下...使用Nginx+WordPress搭建个人网站 作者:Pastore Antonio
1453 浏览量
C#图片处理 通常对一幅图片的处理包括:格式变换,缩放(Scale),翻转(Rotate),截取(Clip),滤镜...C#图片处理 作者:Pastore Antonio
1446 浏览量