13

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

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

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

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

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

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

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

4

5 回答 5

24

默认图标嵌入在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()与您现有的代码相去甚远。

于 2009-10-02T06:49:42.850 回答
4

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

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

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

于 2009-08-05T14:53:00.383 回答
2

我有用的答案:

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

于 2009-10-01T20:15:02.130 回答
1

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

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

希望能帮助到你。

于 2009-08-07T22:01:40.680 回答
0

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

于 2009-08-05T14:54:08.340 回答