我有一个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有什么问题吗?
答案 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");
}