Изменение значка Winform по умолчанию для всех приложений
Можно ли изменить значок по умолчанию, используемый в Winform?
В большинстве моих форм свойство значка установлено на пользовательский значок. Для нескольких форм, которые скользят по трещинам, я не хочу, чтобы общий "эй выглядел, он сделал это в визуальной студии".
Одним из решений является утомительно проверить каждую из моих форм, чтобы убедиться, что у них либо есть собственный набор значков, либо установлено значение ShowIcon равным False.
Другое решение состоит в том, чтобы каждая из моих форм наследовала от базового класса, который устанавливает пользовательский значок в конструкторе.
Помимо этих решений, какие у меня есть другие варианты?
EDIT:
Я надеялся, что будет возможность заменить источник значка акции моим собственным. Это где-то в файле ресурсов? Или он встроен в .NET dll, который я не могу (или действительно, не должен) изменять?
BOUNTY EDIT:
Есть ли способ сделать это без редактирования или написания одной строки кода? Меня не волнует, как непрактичное, сложное, нерасторжимое решение... Я просто хочу знать, возможно ли это. Мне нужно удовлетворить мое любопытство.
Ответы
Ответ 1
Значок по умолчанию встроен в 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
, который имеет набор значков
- a factory
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>()) {
}
Конечно - это не намного красивее! Другим вариантом может быть метод расширения С# 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()
от вашего существующего кода.
Ответ 2
Базовый класс - это тот, который мы используем.
Если вы ищете альтернативу (не обязательно хорошие), вы можете:
1. Используйте IOC для создания экземпляра всех ваших форм и изменения контейнера IOC для установки значка приложения.
2. Используйте AOP для вставки кода во все формы, которые устанавливают значок приложения.
Лично я бы просто использовал базовый класс...
Ответ 3
Мой полезный ответ:
Нет
Было бы неплохой возможностью для внедрения microsoft, поскольку большинство приложений используют один и тот же значок для всего приложения.
Ответ 4
Если вы хотите обновить все значки другим, вы можете создать небольшое приложение, которое редактирует все файлы *.Designer.vb(в vb.net) и добавляет следующую строку в InitializeComponent:
Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico")
Надеюсь, что это поможет.
Ответ 5
Если все ваши формы находятся в одном проекте, вы можете взять DLL проекта и использовать отражение, чтобы получить каждый тип в dll. Если тип получен из формы, вы можете установить свойство "Значок типа" так, как хотите. Я не уверен, что будет накладными расходами на производительность, если проект очень большой.