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

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

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

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

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

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

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

有帮助吗?

解决方案

默认 图标嵌入到 winforms dll 中 - 查看反射器(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 具有图标集的类
  • 一个工厂 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.使用IOC实例所有的形式和修改IOC容器设置应用程序图标。 2.使用AOP来代码插入到所有的,用于设置应用图标的形式。

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

我的有用的答案:

没有

将是一个不错的功能为微软虽然实现,因为大多数应用程序使用整个应用程序相同的图标。

如果您想更新的另外一个所有的图标,你可以建立一个小的应用程序,编辑所有的* .Designer.vb文件(在vb.net),并添加如下因素行的InitializeComponent:

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

希望它能帮助。

如果您所有的形式都在短短的一个项目,然后您可以利用该项目的DLL和使用反射来获取DLL中的每一个类型。如果类型从表派生你可以将该类型的图标属性设置为任何你想要的。我不知道的性能开销将是什么,如果这个项目是非常大的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top