如何在C# VSTO Word插件中用idMso自定义按钮图标?
解决VSTO Ribbon XML中内置idMso控件自定义图标不生效的问题
1. 修正图片资源的嵌入配置
右键Resources文件夹中的HighlighterBgImage.png,打开属性面板:
- 将生成操作设置为
嵌入的资源 - 将复制到输出目录设置为
如果较新则复制
2. 完善loadImage回调的资源读取逻辑
在你的Ribbon代码类(如Ribbon1.cs)中,确保Ribbon_LoadImage方法能正确读取嵌入的资源:
public Image Ribbon_LoadImage(string imageName) { var assembly = System.Reflection.Assembly.GetExecutingAssembly(); // 资源名称格式:[项目命名空间].Resources.[图片文件名],需替换为你的实际命名空间 string resourceFullName = $"{assembly.GetName().Name}.Resources.{imageName}"; using (Stream stream = assembly.GetManifestResourceStream(resourceFullName)) { return stream != null ? Image.FromStream(stream) : null; } }
3. 改用getImage回调覆盖内置图标
对于绑定idMso的控件,Office会优先加载内置图标,直接设置image属性无效,需改用getImage回调:
修改Ribbon XML中的toggleButton配置:
<toggleButton idMso="InkHighlighter" getImage="GetCustomHighlighterImage" visible="true" size="large" />
然后在Ribbon代码类中添加对应的回调方法:
public Image GetCustomHighlighterImage(IRibbonControl control) { return Ribbon_LoadImage("HighlighterBgImage.png"); }
4. 验证资源名称正确性
如果仍不生效,可通过以下代码输出所有嵌入资源的名称,确认你的图片资源路径是否正确:
var assembly = System.Reflection.Assembly.GetExecutingAssembly(); foreach (var resName in assembly.GetManifestResourceNames()) { System.Diagnostics.Debug.WriteLine(resName); }
运行插件后,在Visual Studio的输出窗口查看资源名称,确保与代码中使用的完全一致。
内容的提问来源于stack exchange,提问作者tAMBI99
相关产品推荐
相关产品推荐

