Office Add-in中是否可仅通过Ribbon XML指定自定义按钮图片?
Ribbon 自定义图片加载方案
没有可以直接引用项目资源文件中图片的纯XML配置方式,你之前直接填资源名、填磁盘绝对路径不生效,本质是不符合Ribbon XML的图片加载规则,两种可落地的方案按需选即可。
为什么imageMso能正常用,自定义image不行
imageMso是专门用来加载Office内置图标的属性,微软已经给所有内置图标做了全局ID映射,不需要额外处理加载逻辑。- 普通
image属性的默认解析逻辑只识别两类来源:一是Custom UI包内和XML文件同级存储的内嵌图片,二是通过loadImage全局回调返回的图片对象,它既不能直接读取项目Properties资源里的对象,也出于安全限制不会直接加载磁盘任意路径的图片文件。
方案1:零代码纯XML实现(仅适用于Custom UI内嵌场景)
如果你直接编辑Office文件(xlsm/docx/pptm等)的自定义UI部件,或者愿意手动调整VSTO项目的内嵌资源结构,可以用这个方案:
- 将你需要用到的图片(建议用带透明通道的PNG格式)放到Custom UI包内,和Ribbon配置XML文件放在同一级目录
- 按钮配置里直接写图片的完整文件名即可,不需要加路径:
<button id="btnInsEq2" onAction="BtnInsEq2_Click" image="InsEquation2.png" showImage="true" showLabel="false" />
注意:Ribbon设计器默认生成的项目不会把资源文件里的图片打包到Custom UI包内,所以你最开始直接写资源名的写法找不到对应文件,才会加载失败。
方案2:少量代码全局回调(通用方案,推荐)
这个方案适配所有Ribbon定制场景(VSTO外接程序、VBA定制、Com加载项都能用),一次配置所有按钮的自定义图片都能复用,出错率极低:
- 给最外层的
<customUI>根节点添加loadImage回调配置:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" loadImage="RibbonLoadImage"> <!-- 你原有的所有Ribbon标签、按钮配置全部放在这个节点内部,原有按钮的image="InsEquation2"写法不需要修改 --> </customUI>
- 实现对应的回调逻辑,直接从资源文件按名称读取图片返回即可:
- C# VSTO项目代码:
public System.Drawing.Bitmap RibbonLoadImage(string imageId) { return (System.Drawing.Bitmap)Properties.Resources.ResourceManager.GetObject(imageId); }
- VB.NET VSTO项目代码:
Public Function RibbonLoadImage(imageId As String) As System.Drawing.Bitmap Return CType(My.Resources.ResourceManager.GetObject(imageId), System.Drawing.Bitmap) End Function
- VBA项目代码:
Function RibbonLoadImage(ImageID As String) As IPictureDisp Set RibbonLoadImage = LoadPicture("C:\固定存放Ribbon图标的路径\" & ImageID & ".png") End Function
配置完成后运行,所有写了image="资源名"的控件都会自动触发这个回调加载对应图片,不需要给每个按钮单独写加载逻辑。
内容的提问来源于stack exchange,提问作者George Keeling
相关产品推荐
相关产品推荐

