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

Kyl*_*net 13 customization icons visual-studio-2008 winforms

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

我的大多数表单都将其图标属性设置为自定义图标.对于穿过裂缝的少数形式,我不希望通用的"嘿看,他在视觉工作室制作了这个"图标.

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

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

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

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

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

Mar*_*ell 25

默认图标被嵌入的WinForms DLL -看反射器(DefaultIcon),它是:

defaultIcon = new Icon(typeof(Form), "wfc.ico");
Run Code Online (Sandbox Code Playgroud)

在那里检查另一个常见位置没有魔力,因此如果不更改代码就无法做到.

你总是可以通过基于场的反射来拥抱黑暗势力?注意:这是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

要做得好; 两种常见的选择;

  • 一个Form具有图标集的基类
  • 工厂Form方法 - 可能是这样的:

码:

public static T CreateForm<T>() where T : Form, new() {
    T frm = new T();
    frm.Icon = ...
    // any other common code
    return frm;
}
Run Code Online (Sandbox Code Playgroud)

而不是:

using(var frm = new MySpecificForm()) {
    // common init code
}
Run Code Online (Sandbox Code Playgroud)

就像是:

using(var frm = Utils.CreateForm<MySpecificForm>()) {

}
Run Code Online (Sandbox Code Playgroud)

当然 - 这不是更漂亮!另一种选择可能是C#3.0扩展方法,也许是一个流畅的API:

public static T CommonInit<T>(this T form) where T : Form {
    if(form != null) {
        form.Icon = ...
        //etc
    }
    return form;
}
Run Code Online (Sandbox Code Playgroud)

using(var frm = new MySpecificForm().CommonInit()) {
    // ready to use
}
Run Code Online (Sandbox Code Playgroud)

这只是.CommonInit()远离现有代码.