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

标签 winforms visual-studio-2008 icons customization

我可以更改 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/

    相关文章:

    winforms - 最佳实践 : Blocking execution while waiting for an Async method

    visual-studio-2008 - 如何在同一解决方案的不同项目中使用相同的obj文件

    javascript - 如何设置部分 CSS3 形状或图标(Font Awesome 等)的颜色?

    icons - 什么是好的、免费的、插入式的 mimetype 图标集?

    c# - 无法在表单中找到 {Microsoft.VisualBasic.PowerPacks.RectangleShape} 控件

    winforms - 无论 WordWrap 设置如何,TextBox 控件都将行限制为 1024 个字符。如何增加?

    c# - 如何从另一个 WinForm 通过 C# WinForm 查看

    c++ - 为什么生成 pdb 文件会增加我的 native C++ exe 的大小?

    vb.net - 删除字符串中的一个单词

    ios - 由于“缺少图标”,Apple Watch 提交失败