我可以更改 Winform 上使用的默认图标吗?
我的大多数表单都将其图标属性设置为自定义图标。对于从裂缝中溜走的少数表单,我不想要通用的“嘿看,他在视觉工作室制作的”图标。
一种解决方案是繁琐地检查我的每个表单,以确保它们具有自定义图标集或将 ShowIcon 设置为 False。
另一种解决方案是让我的每个表单都继承自一个在构造函数中设置自定义图标的基类。
除了这些解决方案,我还有什么其他选择?
编辑:
我希望有一种方法可以用我自己的方法替换股票图标的来源。它在某个地方的资源文件中吗?或者它是否嵌入在我不能(或真的,真的不应该)修改的 .NET dll 中?
赏金编辑:
有没有办法在不编辑或编写一行代码的情况下完成此操作?我不在乎解决方案是多么不切实际、多么复杂、多么浪费时间……我只是想知道它是否可能。我需要满足我的好奇心。
最佳答案
默认图标嵌入在 winforms dll 中 - 查看反射器( DefaultIcon
)它是:
defaultIcon = new Icon(typeof(Form), "wfc.ico");
那里没有检查另一个常见位置的魔法,所以你不能在不更改代码的情况下做到这一点。
你总是可以通过基于场的反射来拥抱黑暗的力量吗?注意:这是hacky和脆弱的。在你自己的头上!但它有效:
[STAThread]
static void Main() {
// pure evil
typeof(Form).GetField("defaultIcon",
BindingFlags.NonPublic | BindingFlags.Static)
.SetValue(null, SystemIcons.Shield);
// all forms now default to a shield
using (Form form = new Form()) {
Application.Run(form);
}
}
正确地做;两种常见的选择;
Form
具有图标集的类 Form
方法 - 可能类似于:代码:
public static T CreateForm<T>() where T : Form, new() {
T frm = new T();
frm.Icon = ...
// any other common code
return frm;
}
然后而不是:
using(var frm = new MySpecificForm()) {
// common init code
}
就像是:
using(var frm = Utils.CreateForm<MySpecificForm>()) {
}
当然 - 这不是更漂亮!另一种选择可能是 C# 3.0 扩展方法,也许作为流畅的 API:
public static T CommonInit<T>(this T form) where T : Form {
if(form != null) {
form.Icon = ...
//etc
}
return form;
}
和
using(var frm = new MySpecificForm().CommonInit()) {
// ready to use
}
这只是一个
.CommonInit()
远离您现有的代码。
关于winforms - 更改整个应用程序的默认 Winform 图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1233743/