在整个应用程序中更改默认Winform图标

时间:2009-08-05 14:46:39

标签: winforms visual-studio-2008 icons customization

我可以更改Winform上使用的默认图标吗?

我的大部分表单都将其图标属性设置为自定义图标。对于那些滑过裂缝的少数形式,我不希望通用的“嘿看,他在视觉工作室制作了这个”的图标。

一种解决方案是繁琐地检查我的每个表单,以确保它们具有自定义图标集或将ShowIcon设置为False。

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

除了这些解决方案,我还有其他选择吗?

修改 我希望有一种方法可以用我自己的方式替换股票图标的来源。它在某个资源文件中吗?或者它嵌入在.NET dll中,我不能(或者真的,真的不应该)修改?

BOUNTY EDIT: 有没有办法在不编辑或编写单行代码的情况下完成此操作?我不在乎解决方案是多么不切实际,复杂,浪费时间......我只是想知道它是否可行。我需要满足自己的好奇心。

5 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

我有用的答案:

没有

虽然大多数应用程序在整个应用程序中使用相同的图标,但这对微软来说是一个很好的功能。

答案 3 :(得分:1)

如果您想要用另一个图标更新所有图标,您可以构建一个小应用程序来编辑所有* .Designer.vb文件(在vb.net中)并将以下行添加到InitializeComponent:

Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico")

希望它有所帮助。

答案 4 :(得分:0)

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