Office 右键菜单添加失败(VSTOWord),CommandBar,FluentUI,ContextMenu idMso

说明

对Word中的Chart添加右键菜单失败,遍历了所有CommandBar.Controls都没有找到匹配的那个CommandBar,因此找到了一种新的方式实现。

传统的右键菜单添加方式,CommandBar

// cmbcs是CommandBarControls
CommandBarButton cmbb = cmbcs.Add(Type: MsoControlType.msoControlButton, Temporary: false, Before: item.Index) as CommandBarButton;
                    if (cmbb != null)
                    {
                        cmbb.BeginGroup = true;
                        cmbb.FaceId = 1;
                        cmbb.Tag = item.Tag.ToString();
                        cmbb.Caption = item.Caption;
                        cmbb.Visible = true;
                        if (!addHandelr)
                            cmbb.Click += Cmbb_Click;
                    }

Chart(图表)右键菜单添加失败

  1. 每一种控件(图表、表格、文本等)有对应的右键菜单;
  2. 当我们添加时,先获取到对应的右键菜单,再添加按钮到这个菜单对象中;
  3. 但是无法找到图表(Chart)的右键菜单对象,我是遍历了所有的右键菜单都没有找到“在Word界面中看到的那个菜单”。
private bool addHandelr = false;
        private void CreateRightMenu(Microsoft.Office.Interop.Word.Selection Sel)
        {
            List<string> listNames = new List<string>();
            string names = "";
            foreach (CommandBar item in WordGlobalHelper.Instance.WordApplication.CommandBars)
            {
                string name = item.Name;
                names += name+",";
                listNames.Add(name);
            }
            CommandBar cmb = null;
            if (Sel.Tables.Count > 0)
            {
                // 选中了表格
                cmb = WordGlobalHelper.Instance.WordApplication.CommandBars["Table Text"];
            }
            else if (Sel.Range.InlineShapes.Count > 0 || Sel.Range.ShapeRange.Count > 0)
            {
                // 选中了图片/形状/图表
                if (IsChart(Sel))
                {
                    cmb = WordGlobalHelper.Instance.WordApplication.CommandBars["Word for Macintosh 5.0"];
                    List<string> listNames2 = new List<string>();
                    names = "";
                    foreach (string menuName in listNames)
                    {
                        try
                        {
                            cmb = WordGlobalHelper.Instance.WordApplication.CommandBars[menuName];
                            names += menuName + ",";
                            foreach (CommandBarControl item in cmb.Controls)
                            {
                                if (item.Caption.Contains("图表")|| item.Caption.Contains("另存为模板"))
                                {
                                    listNames2.Add(menuName);
                                    break;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            string message = ex.Message;
                        }

                    }
                }
            }
            else
            {
                // 其他,包括:普通文本、超链接、书签、脚注/尾注、页首/页眉等
                // 只做普通文本处理
                cmb = WordGlobalHelper.Instance.WordApplication.CommandBars["Text"];
            }

            if (cmb == null) return;



            cmb.Reset();

            CommandBarControls cmbcs = cmb.Controls;
            foreach (CommandBarControl item in cmbcs)
            {
                string ss = item.Caption;

            }


            var mylsit = GetRightMenuInfo();
            foreach (var item in mylsit)
            {
                try
                {

                    CommandBarButton cmbb = cmbcs.Add(Type: MsoControlType.msoControlButton, Temporary: false, Before: item.Index) as CommandBarButton;
                    if (cmbb != null)
                    {
                        cmbb.BeginGroup = true;
                        cmbb.FaceId = 1;
                        cmbb.Tag = item.Tag.ToString();
                        cmbb.Caption = item.Caption;
                        cmbb.Visible = true;
                        if (!addHandelr)
                            cmbb.Click += Cmbb_Click;
                    }


                }
                catch (COMException ex)
                {
                    LogHelper.Log(ex);
                }
                catch (Exception ex)
                {
                    LogHelper.Log(ex);
                }

            }
            addHandelr = true;
        }

新的右键菜单添加方式,FluentUI,支持Office2010以上的版本

实现方式,和Ribbon功能区的实现一样,可以到网上搜索“用xml定义Ribbon界面”。

步骤:

  1. 创建一个VSTOWord项目;
  2. 添加新建项“功能区(XML)”,叫做“Ribbon1”;
  3. 重写ThisAddIn中的CreateRibbonExtensibilityObject方法;
    1. ThisAddIn.cs
    2. private void ThisAddIn_Startup(object sender, System.EventArgs e)
              {
              }
      
              private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
              {
              }
      
              protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
              {
                  return new Ribbon1();
              }

  4. 编辑新建的xml文件,“Ribbon1.xml”;
  5. 修改<customUI> 节点下的内容;
    1. Ribbon1.xml
    2. <?xml version="1.0" encoding="UTF-8"?>
      <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
      	<contextMenus>
              <!--文本区域右键菜单-->
      		<contextMenu idMso="ContextMenuText">	
      			<button id="MyCustomContextButtonText"
      					label="Custom Context Button for Text"
      					onAction="OnCustomButtonClick" />
      		</contextMenu>
      		<!-- Word 图表上下文菜单 -->
      		<contextMenu idMso="ContextMenuChartArea">	<!--图表区域-->
      			<button id="MyCustomContextButtonChartArea"
      					label="Custom Context Button for Chart Area"
      					onAction="OnCustomButtonClick" />
      		</contextMenu>
      		<contextMenu idMso="ContextMenuChartPlotArea">	<!--绘图区域-->
      			<button id="MyCustomContextButtonPlotArea"
      					label="Custom Context Button for Plot Area"
      					onAction="OnCustomButtonClick" />
      		</contextMenu>
      		<!-- 当右键点击表格时,显示此菜单 -->
      		<contextMenu idMso="ContextMenuTable">
      			<button id="MyCustomContextButtonTable"
                          label="Custom Context Button for Table"
                          onAction="OnCustomButtonClick" />
      		</contextMenu>
      
      		<!-- 当右键点击表格单元格时,显示此菜单 -->
      		<contextMenu idMso="ContextMenuTableCell">
      			<button id="MyCustomContextButtonTableCell"
                          label="Custom Context Button for TableCell"
                          onAction="OnCustomButtonClick" />
      		</contextMenu>
      
      		<!-- 当右键点击表格标题时,显示此菜单 -->
      		<contextMenu idMso="ContextMenuHeadingTable">
      			<button id="MyCustomContextButtonHeadingTable"
                          label="Custom Context Button for HeadingTable"
                          onAction="OnCustomButtonClick" />
      		</contextMenu>
      
      		<!-- 当右键点击表格列表时,显示此菜单 -->
      		<contextMenu idMso="ContextMenuListTable">
      			<button id="MyCustomContextButtonListTable"
                          label="Custom Context Button for ListTable"
                          onAction="OnCustomButtonClick" />
      		</contextMenu>
      
      		<!-- 当右键点击表格图片时,显示此菜单 -->
      		<contextMenu idMso="ContextMenuPictureTable">
      			<button id="MyCustomContextButtonPictureTable"
                          label="Custom Context Button for PictureTable"
                          onAction="OnCustomButtonClick" />
      		</contextMenu>
      
      		<!-- 当右键点击表格文本时,显示此菜单 -->
      		<contextMenu idMso="ContextMenuTextTable">
      			<button id="MyCustomContextButtonTextTable"
                          label="Custom Context Button for TextTable"
                          onAction="OnCustomButtonClick" />
      		</contextMenu>
      
      		<!-- 当右键点击整个表格时,显示此菜单 -->
      		<contextMenu idMso="ContextMenuTableWhole">
      			<button id="MyCustomContextButtonTableWhole"
                          label="Custom Context Button for TableWhole"
                          onAction="OnCustomButtonClick" />
      		</contextMenu>
      
      		<!-- 当右键点击链接的整个表格时,显示此菜单 -->
      		<contextMenu idMso="ContextMenuTableWholeLinked">
      			<button id="MyCustomContextButtonTableWholeLinked"
                          label="Custom Context Button for TableWholeLinked"
                          onAction="OnCustomButtonClick" />
      		</contextMenu>
      	</contextMenus>
      </customUI>

  6. 编辑对应的OnAction
    1. Ribbon1.cs
    2. #region 功能区回调
              //在此处创建回叫方法。有关添加回叫方法的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=271226
      
              public void Ribbon_Load(Office.IRibbonUI ribbonUI)
              {
                  this.ribbon = ribbonUI;
              }
      // Xml中按钮对应的事件,OnAction
              public void OnCustomButtonClick(IRibbonControl control)
              {
                  System.Windows.Forms.MessageBox.Show("Custom Button Clicked");
              }
              #endregion

  7. 说明
    1. 结构
      1. <?xml version="1.0" encoding="UTF-8"?>
        <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
        	<contextMenus>
                <!--文本区域右键菜单-->
        		<contextMenu idMso="ContextMenuText">	
        			<button id="MyCustomContextButtonText"
        					label="Custom Context Button for Text"
        					onAction="OnCustomButtonClick" />
        		</contextMenu>
        		<!-- Word 图表上下文菜单 -->
        		<contextMenu idMso="ContextMenuChartArea">	<!--图表区域-->
        			<button id="MyCustomContextButtonChartArea"
        					label="Custom Context Button for Chart Area"
        					onAction="OnCustomButtonClick" />
        		</contextMenu>
        		<contextMenu idMso="ContextMenuChartPlotArea">	<!--绘图区域-->
        			<button id="MyCustomContextButtonPlotArea"
        					label="Custom Context Button for Plot Area"
        					onAction="OnCustomButtonClick" />
        		</contextMenu>
        	</contextMenus>
        </customUI>

    2. isMso 是关键(相当于控件Button、TextBox这种名称),决定是否能够添加正确的控件。

idMso对照表

  1. word中的idMso部分对照表;
  2. office中所有的对照表下载地址:(微软)https://www.microsoft.com/en-us/download/details.aspx?id=50745

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值