Изменить значок Winform по умолчанию во всем приложении

Могу ли я изменить значок по умолчанию, используемый в Winform?

У большинства моих форм свойство icon установлено на собственный значок. Для немногих форм, которые проскальзывают через трещины, я нене хочу родовогоэй смотри, он сделал это в визуальной студии значок.

Одно из решений состоит в том, чтобы утомительно проверять каждую из моих форм, чтобы убедиться, что у них либо установлен пользовательский значок, либо для ShowIcon установлено значение False.

Другое решение состоит в том, чтобы каждая из моих форм наследовала от базового класса, который задает пользовательский значок в конструкторе.

Помимо этих решений, какие еще есть варианты?

РЕДАКТИРОВАТЬ: Я надеялся, что найдется способ заменить исходный значок со своим собственным. Это где-то в файле ресурсов? Или это встроенный в .NET DLL, что я могут (или действительно, действительно не должент) изменить?

BOUNTY EDIT: Есть ли способ сделать это без редактирования или написания одной строки кода? Я неМне все равно, насколько непрактичным, сложным, бесполезным решением проблемы ... Я просто хочу знать, если этовозможно. Мне нужно удовлетворить свое любопытство.

Ответы на вопрос(5)

Решение Вопроса

дефолт значок встроен в dll winforms - смотрит на отражатель (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() 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()) {

}

Конечно - это ненамного красивее! Другим вариантом может быть метод расширения C # 3.0, возможно, в виде свободного API:

public static T CommonInit(this T form) where T : Form {
    if(form != null) {
        form.Icon = ...
        //etc
    }
    return form;
}

а также

using(var frm = new MySpecificForm().CommonInit()) {
    // ready to use
}

Это тогда просто.CommonInit() от вашего существующего кода.

 Daniel Mošmondor23 мар. 2010 г., 15:58
Это абсолютно мега-круто. Просто спас меня от работы на 50 формах ...
 Dinis Cruz08 янв. 2012 г., 02:23
Опция отражения отлично работала, и с платформой O2API отражения, код для этого неэто выглядит страшно typeof (Form) .fieldValue ("DefaultIcon», SystemIcons.Shield);
 Kyle Gagnet02 окт. 2009 г., 16:31
Принято за фактическое нахождение иконки ... достаточно близко

Мой полезный ответ:

нет

Это было бы неплохо для Microsoft, поскольку большинство приложений используют один и тот же значок во всем приложении.

вы можете создать небольшое приложение, которое редактирует все файлы * .Designer.vb (в vb.net) и добавляет следующую строку в InitializeComponent:

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

Надеюсь, поможет.

Опция базового класса - это та, которую мы используем.

Если вы ищете альтернативу (не обязательно хорошую), вы можете: 1. Использовать IOC для создания экземпляров всех ваших форм и изменить контейнер IOC, чтобы установить значок приложения. 2. Используйте AOP, чтобы вставить код во все формы, которые устанавливают значок приложения.

Лично яЯ просто использовал базовый класс ...

Если все ваши формы находятся в одном проекте, вы можете взять dll проекта и использовать отражение для получения каждого типа в dll. Если тип является производным от формы, вы можете установить типСвойство Icon для того, что вы хотите. Я не уверен, какой будет производительность, если проект очень большой.

Ваш ответ на вопрос