ToolStripButton:编程分配图像有什么问题?

4

有一个带有ToolStrip的表单。这个ToolStrip包含一个ToolStripButton。我想给这个按钮分配一张图片:

this.btnSaveFile.Image = Bitmap.FromFile("C:\\Work\\Icons\\png\\save.png");

只有在指定路径上有save.png时,它才有效。否则,我会得到一个FileNotFound异常。

如果我通过表单设计器创建了一个表单,Visual Studio会创建如下代码:

this.toolStripButton9.Image = ((System.Drawing.Image) (resources.GetObject("toolStripButton9.Image")));

toolStripButton9.Image不是真实名称。Visual Studio会将我的文件save.png转换为toolStripButton9.Image。

但我通过编程方式创建窗体,没有使用设计器。我的问题是如何通过编程方式将图像分配给ToolStripBotton?

我尝试将图像添加到项目中,但效果不大。我不知道如何让Visual Studio抓取它并嵌入到我的可执行文件中,这样我就不需要在指定位置上使用此文件。

在MSDN中,我只看到了像这样的解决方案:

this.toolStripButton1.Image = Bitmap.FromFile("c:\\NewItem.bmp");

但是如我之前所述,它并不起作用。我知道有一个简单的解决方案,但是我看不到它。您能给我一些提示吗?


我更新了我的答案,并添加了额外的信息,希望能进一步帮助你。 - Webleeuw
Webleeuw,是的,它可以工作!非常感谢您提供的这个例子! - Racoon
2个回答

5

在Visual Studio中,打开解决方案资源管理器中的“属性”文件夹,然后打开Resources.resx文件,并将现有的图像文件添加为资源。然后,您可以通过Resource静态类以编程方式使用它:

Image x = Resources.MyResourceImage;

我建议的代码完整示例:

以下是我建议的代码完整示例:

using System.Windows.Forms;
using Testapplication.Properties;

namespace Testapplication {
    public class Class1 {
        public Class1() {
            Form MyForm = new Form();
            ToolStrip MyToolStrip = new ToolStrip();
            MyForm.Controls.Add(MyToolStrip);

            ToolStripButton MyButton = new ToolStripButton();
            MyToolStrip.Items.Add(MyButton);

            MyButton.Image = Resources.MyResourceImage;

            MyForm.Show();
        }
    }
}

不要忘记将using添加到YourApps的Properties命名空间中。您的Resources.resx(.cs)文件位于该命名空间中,用于提供强类型对象引用,如图像。在您的情况下,用"save"(不包括引号)替换"MyResourceImage"。
附:我的Resources.designer.cs文件最重要的部分。
internal static System.Drawing.Bitmap MyResourceImage {
    get {
        object obj = ResourceManager.GetObject("MyResourceImage", resourceCulture);
        return ((System.Drawing.Bitmap)(obj));
    }
}

Webleeuw,感谢您的回答。很抱歉,但似乎不起作用。我通过属性->资源添加了保存png文件。现在我在项目下的资源文件夹中看到它。但是我该如何引用它?我可以在"MyResourceImage"之前放置什么?文件resource.Designer.cs会自动创建这段代码: object obj = ResourceManager.GetObject("save", resourceCulture); 但我无法使用类似这样的结构...有什么想法吗? - Racoon
如果你让智能感知填空,会发生什么?如果你输入“Resources.”,它会给出什么建议? - RvdK
Webleeuw,是的,它可以工作!非常感谢您提供的这个例子! - Racoon

0

所以你的意思是从嵌入式资源中设置图像?

string res = "MyAssembly.Resources.toolStripButton9.Image";
Stream s = this.GetType().Assembly.GetManifestResourceStream( res );
Icon icon = Icon.FromStream( s );

如果Webleeuws的答案可行,那就用它吧,比这个容易多了 :P

谢谢:),这对我来说有效,但我不知道它是否是Racoon寻找的解决方案。 - Webleeuw
PoweRoy,感谢您的回答。很抱歉,我不理解。由于我不使用表单设计器,因此我没有toolStripButton9.Image。所以我不知道如何使用这段代码... Webleeuws似乎接近解决方案,但是...请看一下我对他的回答的评论。 - Racoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接