更改整个应用程序的默认 Winform 图标
-
22-07-2019 - |
题
我可以更改 Winform 上使用的默认图标吗?
我的大多数表单都将其图标属性设置为自定义图标。对于少数漏掉的表单,我不想要通用的“嘿,看,他在视觉工作室中制作了这个”图标。
一种解决方案是繁琐地检查我的每一个表单,以确保它们具有自定义图标集或将 ShowIcon 设置为 False。
另一种解决方案是让我的每个表单都继承自一个基类,该基类在构造函数中设置自定义图标。
除了这些解决方案之外,我还有哪些其他选择?
编辑:我希望有一种方法可以用我自己的图标来替换股票图标的来源。它在某个资源文件中吗?或者它是否嵌入到我无法(或者真的、真的不应该)修改的 .NET dll 中?
赏金编辑:有没有一种方法可以在不编辑或编写一行代码的情况下完成此任务?我不在乎这个解决方案是多么不切实际、复杂、浪费时间......我只是想知道是否可能。我需要满足我的好奇心。
解决方案
这 默认 图标嵌入到 winforms dll 中 - 查看反射器(DefaultIcon
) 这是:
defaultIcon = new Icon(typeof(Form), "wfc.ico");
那里没有检查另一个公共位置的魔法,所以如果不更改代码就无法做到这一点。
您总能通过基于场的反射来拥抱黑暗力量吗?笔记:这是很糟糕且脆弱的。在你自己的头上!但它有效:
[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()
远离您现有的代码。
其他提示
基类选项是,我们使用的一个。
如果你正在寻找一种替代(不一定是好的),你可以: 1.使用IOC实例所有的形式和修改IOC容器设置应用程序图标。 2.使用AOP来代码插入到所有的,用于设置应用图标的形式。
就个人而言,我只是使用基类...
我的有用的答案:
没有
将是一个不错的功能为微软虽然实现,因为大多数应用程序使用整个应用程序相同的图标。
如果您想更新的另外一个所有的图标,你可以建立一个小的应用程序,编辑所有的* .Designer.vb文件(在vb.net),并添加如下因素行的InitializeComponent:
Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico")
希望它能帮助。
如果您所有的形式都在短短的一个项目,然后您可以利用该项目的DLL和使用反射来获取DLL中的每一个类型。如果类型从表派生你可以将该类型的图标属性设置为任何你想要的。我不知道的性能开销将是什么,如果这个项目是非常大的。