说明
对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(图表)右键菜单添加失败
- 每一种控件(图表、表格、文本等)有对应的右键菜单;
- 当我们添加时,先获取到对应的右键菜单,再添加按钮到这个菜单对象中;
- 但是无法找到图表(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界面”。
步骤:
- 创建一个VSTOWord项目;
- 添加新建项“功能区(XML)”,叫做“Ribbon1”;
- 重写ThisAddIn中的CreateRibbonExtensibilityObject方法;
- ThisAddIn.cs
-
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(); }
- 编辑新建的xml文件,“Ribbon1.xml”;
- 修改<customUI> 节点下的内容;
- Ribbon1.xml
-
<?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>
- 编辑对应的OnAction
- Ribbon1.cs
-
#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
- 说明
- 结构
-
<?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>
-
- isMso 是关键(相当于控件Button、TextBox这种名称),决定是否能够添加正确的控件。
- 结构
idMso对照表
- word中的idMso部分对照表;
- office中所有的对照表下载地址:(微软)https://www.microsoft.com/en-us/download/details.aspx?id=50745