Logo

Logo

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

Xzavier Aaron
Xzavier Aaron 2024年07月16日
671 阅读 0 评论 约 4263 字 阅读约 9 分钟

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

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


查看完整代码

橙子主题打折出售

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

购买它
部分文章可能存在转载,如果涉及到侵权,请联系删除文章。

探索AIGC相关的精彩内容,共 15 篇文章

Azure AI 服务之语音识别

简介 Azure AI 服务中的语音识别 API 是微软提供的一项先进技术,旨在帮助开发者轻松实现语 ... C#Word开发,VSTO中自定义右键菜单,CommandBarButton的Click事件不触发,或者只触发一次 原创

2026-02-17 · Xzavier Aaron
MCP | 一文详解什么是 MCP以及 MCP 可以做什么

一、什么是 MCP MCP(Model Context Protocol)是一个专为大型语言模型(L ... C#Word开发,VSTO中自定义右键菜单,CommandBarButton的Click事件不触发,或者只触发一次 原创

2026-02-14 · Shen, Luke
你的工作流程,值得一个“全自动数字分身”:录制、截图、成文,一气呵成

一、一句话认识 TestFlow Recorder 在数字化工作环境中,如何准确记录操作步骤并生成清 ... C#Word开发,VSTO中自定义右键菜单,CommandBarButton的Click事件不触发,或者只触发一次 原创

2026-02-14 · Xzavier Aaron
Flowise 前端框架配置指南

用户需求 问题:有没有适合配置 Flowise 的前端框架? 目标:寻找类似 Open WebUI ... C#Word开发,VSTO中自定义右键菜单,CommandBarButton的Click事件不触发,或者只触发一次 原创

2026-02-14 · Xzavier Aaron