跨整个应用程序更改默认的Winform图标

13

我能在Winform上更改默认使用的图标吗?

我的大多数窗体都将其图标属性设置为自定义图标。对于那些漏掉的少数窗体,我不希望显示通用的“嘿,他是在Visual Studio中创建的”图标。

一种解决方案是费力地检查我的每个窗体,以确保它们要么已设置自定义图标,要么将ShowIcon设置为False。

另一个解决方案是让我的每个窗体都从一个基类继承,在构造函数中设置自定义图标。

除了这些解决方案外,我还有哪些选择?

编辑: 我希望有一种方法可以用自己的图标替换存储源的公共图标。它是否在某个资源文件中?或者它被嵌入在一个.NET dll中,我不能(或者真的不应该)进行修改?

悬赏任务编辑: 有没有一种方法可以在不编辑或编写任何代码的情况下完成这项任务?无论这种解决方案有多么不切实际、复杂或浪费时间...我只是想知道它是否可行。我需要满足我的好奇心。

5个回答

24

默认图标嵌入在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
}

Something like:

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()即可与您现有的代码兼容。

已接受实际找到图标...足够接近。 - Kyle Gagnet
反射选项非常实用,而且使用 O2 平台的反射 API 来完成这项工作的代码看起来并不可怕。typeof(Form).fieldValue("defaultIcon", SystemIcons.Shield); - Dinis Cruz

4

基类选项是我们使用的选项。

如果您正在寻找另一种选择(不一定是好的选择),您可以: 1. 使用IOC实例化所有表单,并修改IOC容器以设置应用程序图标。 2. 使用AOP将代码插入到所有表单中,以设置应用程序图标。

个人而言,我只会使用基类...


2

我的有用回答:

不行。

这可能是微软实现的一个不错的功能,因为大多数应用程序在整个应用程序中使用相同的图标。


1
如果您想通过另一个图标更新所有图标,可以构建一个小应用程序来编辑所有*.Designer.vb文件(在vb.net中),并将以下行添加到InitializeComponent:
Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico")

希望能有所帮助。


0

如果您的所有表单都在同一个项目中,那么您可以获取该项目的dll并使用反射来获取dll中的每个类型。如果该类型派生自Form,则可以将该类型的Icon属性设置为您想要的任何内容。如果项目非常大,我不确定性能开销会是多少。


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