在运行时将更改应用于mainforms Form.Icon

时间:2010-10-10 07:02:30

标签: c# .net winforms

我有一个System.Windows.Forms.Form,并希望在运行时更改Form.Icon以显示状态。我已经设法从项目资源加载图标:

Type type = this.GetType();
System.Resources.ResourceManager resources =
    new System.Resources.ResourceManager(type.Namespace + ".Properties.Resources", this.GetType().Assembly);
this.Icon = (System.Drawing.Icon)resources.GetObject(
    type.Namespace + ".Icons." + statusText + ".ico");

但显示的图标始终保持不变(设计时间图标)。我是否必须调用方法来告知表单应用更改?我使用Form.Icon有什么问题吗?

4 个答案:

答案 0 :(得分:12)

我不清楚你为什么这么做。只需将图标添加到您的资源即可。项目+属性,资源选项卡,添加资源按钮上的箭头,添加现有文件。然后你会在运行时使用它:

    private void button1_Click(object sender, EventArgs e) {
        this.Icon = Properties.Resources.Mumble;
    }

其中 Mumble 是图标的名称。

如果您100%确定GetObject()不返回null,请尝试在设计器中设置Icon属性。如果它仍未显示,则图标格式出现问题。确保它没有太多颜色,256适用于XP。

答案 1 :(得分:5)

好的,Siva和Hans在哪里:GetObject返回null,因为资源的名称不对。通过以下更改,它可以工作:

Type type = this.GetType(); 
System.Resources.ResourceManager resources = 
new System.Resources.ResourceManager(type.Namespace + ".Properties.Resources", this.GetType().Assembly);

// here it comes, call GetObject just with the resource name, no namespace and no extension
this.Icon = (System.Drawing.Icon)resources.GetObject(statusText); 

感谢您的帮助。

答案 2 :(得分:3)

我猜,首先,你的GetObject(...)返回null。这就是类型转换无声地结束既不抛出错误也不改变图标的​​原因。

相反,如果可能,请使用

this.Icon = new System.Drawing.Icon(...) 

重载然后试一试。

答案 3 :(得分:1)

是的,只要应用程序的状态发生变化,您就必须更改图标。

我用一个简单的WinForm应用程序对此进行了测试:

private void button1_Click(object sender, EventArgs e)
{
    this.Icon = Properties.Resources.Gear;
}

private void button2_Click(object sender, EventArgs e)
{
    this.Icon = Properties.Resources.UAC_shield;
}

当程序运行时,单击每个按钮会将表单图标(当然,任务栏中的图标)更改为指定的图标。我刚刚从Visual Studio附带的集合中选择了一些图标,并将它们添加到项目的资源文件中。

您应该能够添加一个简单的方法,您可以在代码中的任何位置调用该方法来设置图标(您也可以从Form_Load中调用它):

private void ChangeIconStatus(string statusText)
{
    Type type = this.GetType();
    System.Resources.ResourceManager resources =
    new System.Resources.ResourceManager(type.Namespace + ".Properties.Resources", this.GetType().Assembly);
    this.Icon = (System.Drawing.Icon)resources.GetObject(type.Namespace + ".Icons." + statusText + ".ico");
}