【问题标题】:Change Default Winform Icon Across Entire App更改整个应用程序的默认 Winform 图标
【发布时间】:2009-08-05 14:46:38
【问题描述】:

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

我的大多数表单都将其图标属性设置为自定义图标。对于少数漏掉的表单,我不想要通用的“嘿,看,他在 Visual Studio 中制作的”图标。

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

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

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

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

赏金编辑: 有没有办法在不编辑或编写一行代码的情况下完成此操作?我不在乎解决方案是多么不切实际、复杂、浪费时间……我只想知道这是否可能。我需要满足我的好奇心。

【问题讨论】:

    标签: winforms visual-studio-2008 icons customization


    【解决方案1】:

    default 图标嵌入在 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() 与您现有代码的距离。

    【讨论】:

    • 接受实际找到图标...足够接近
    • 反射选项效果很好,使用 O2 平台的反射 API,执行此操作的代码看起来并不可怕 typeof(Form).fieldValue("defaultIcon", SystemIcons.Shield);跨度>
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我有用的答案:

      没有

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

      【讨论】:

        【解决方案4】:

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

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

        希望对你有帮助。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2013-09-11
            • 1970-01-01
            • 2020-02-09
            • 1970-01-01
            • 2016-01-12
            • 1970-01-01
            • 1970-01-01
            • 2014-08-15
            相关资源
            最近更新 更多