Вопрос по winforms, icons, customization, visual-studio-2008 – Изменить значок Winform по умолчанию во всем приложении

13

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

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

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

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

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

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

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

Ваш Ответ

5   ответов
4

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

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

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

1

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

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

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

24

дефолт значок встроен в 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() от вашего существующего кода.

Опция отражения отлично работала, и с платформой O2API отражения, код для этого неэто выглядит страшно typeof (Form) .fieldValue ("DefaultIcon», SystemIcons.Shield); Dinis Cruz
Это абсолютно мега-круто. Просто спас меня от работы на 50 формах ... Daniel Mošmondor
Принято за фактическое нахождение иконки ... достаточно близко Kyle Gagnet
0

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

2

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

нет

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

Похожие вопросы