代码之家  ›  专栏  ›  技术社区  ›  Kyle Gagnet

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

  •  13
  • Kyle Gagnet  · 技术社区  · 15 年前

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

    我的大多数表单都将其图标属性设置为自定义图标。对于一些从裂缝中溜走的表单,我不想要通用的“嘿,看,他是在VisualStudio中制作的”图标。

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

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

    编辑:

    赏金编辑: 有没有一种不用编辑或编写一行代码就可以实现这一点的方法?我不在乎这个解决方案有多不切实际,多么复杂,多么浪费时间。。。我只是想知道这是否可能。我需要满足我的好奇心。

    5 回复  |  直到 15 年前
        1
  •  24
  •   Marc Gravell    15 年前

    这个 违约 DefaultIcon

    defaultIcon = new Icon(typeof(Form), "wfc.ico");
    

    这里没有检查另一个公共位置的魔法,所以如果不更改代码,就无法执行此操作。

    [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 类,该类设置了图标
    • 形式 方法-可能类似于:

    代码:

    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扩展方法,可能是作为fluent 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() 远离您现有的代码。

        2
  •  4
  •   ConsultUtah    15 年前

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

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

        3
  •  2
  •   Jage    15 年前

    我的有用答案是:

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

        4
  •  1
  •   Sebastian    15 年前

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

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

        5
  •  0
  •   jball    14 年前

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