C# 在功能区中使用.ico图像

C# 在功能区中使用.ico图像,c#,xml,excel,ribbonx,C#,Xml,Excel,Ribbonx,我有一个c#加载项,它有一个自定义功能区,但是,我没有按钮的图像。我没有.bmp文件,只有.ico文件。如果可能的话,最好不要转换任何东西 功能区是通过xml创建的, 不是visual studio功能区设计器,来自和: 在“代码隐藏”中,设置图像: customButton1.Image = new Icon("icon.ico").ToBitmap(); 完成这项工作有两种可能的方法。MSDN中的文章中描述了这两种情况: 元素的loadImage属性使您能够指定可以加载所有图像的回调。

我有一个c#加载项,它有一个自定义功能区,但是,我没有按钮的图像。我没有.bmp文件,只有.ico文件。如果可能的话,最好不要转换任何东西



功能区是通过xml创建的, 不是visual studio功能区设计器,来自和:

在“代码隐藏”中,设置图像:

customButton1.Image = new Icon("icon.ico").ToBitmap();

完成这项工作有两种可能的方法。MSDN中的文章中描述了这两种情况:

  • 元素的loadImage属性使您能够指定可以加载所有图像的回调。设置此回调过程后,Office将调用回调过程,并将图像属性中的字符串传递给加载图像的每个控件。您不需要多次实现getImage回调,例如对每个需要图像的控件执行一次回调

    
    

  • 为了提供按钮的图像,Office调用GetImage函数。它传递参数“mypic.jpg”,并期望返回一个IPICUTREDISP对象。通过使用这种技术,您可以编写一个回调过程来返回自定义所需的所有图像,而无需编写每个控件的getImage回调。请注意,调用功能区的Invalidate方法或InvalidateControl方法时,不会再次调用loadImage回调。对于需要在运行时动态更改图像的控件,请使用getImage回调

    例如,回调可能如下所示:

     public stdole.IPictureDisp GetImage(string imageName)
     {
       return
          PictureConverter.IconToPictureDisp(Properties.Resources.MyIcon);
     }
    
     public stdole.IPictureDisp GetImageCallback(IRibbonControl control)
     {
         return
           PictureConverter.IconToPictureDisp(Properties.Resources.MyIcon);
     }
    
  • 当需要动态加载图像时,可以使用第二种方法。您需要指定回调函数名,而不是图像属性:
  • 
    

    getImage回调方法必须返回stdole.IPictureDisp类型,因此通常需要将图像转换为该类型。要执行这些转换,可以使用以下PictureConverter类,该类继承自AxHost类

     internal class PictureConverter : AxHost
     {
         private PictureConverter() : base(String.Empty) { }
    
         static public stdole.IPictureDisp ImageToPictureDisp(Image image)
         {
             return (stdole.IPictureDisp)GetIPictureDispFromPicture(image);
         }
    
         static public stdole.IPictureDisp IconToPictureDisp(Icon icon)
         {
              return ImageToPictureDisp(icon.ToBitmap());
          }
    
         static public Image PictureDispToImage(stdole.IPictureDisp picture)
         {
              return GetPictureFromIPicture(picture);
         }
      }
    
    例如,回调可能如下所示:

     public stdole.IPictureDisp GetImage(string imageName)
     {
       return
          PictureConverter.IconToPictureDisp(Properties.Resources.MyIcon);
     }
    
     public stdole.IPictureDisp GetImageCallback(IRibbonControl control)
     {
         return
           PictureConverter.IconToPictureDisp(Properties.Resources.MyIcon);
     }
    

    选择哪种方式取决于您。

    谢谢,我已经尝试过了,但是每个答案都只涉及.bmp文件,没有一个是这么简单的。我修复了您可能会提到的问题。现在似乎找不到该文件,即使它包含在解决方案中。而且我也不确定我最初是否清楚,我不喜欢在编码时使用设计器,因此ribbon是用xml手工编码的