Change Default Winform Ícone em toda App
-
22-07-2019 - |
Pergunta
Posso alterar o ícone padrão usado em um Winform?
A maioria dos meus formulários têm o seu ícone de propriedade definida como um ícone personalizado. Para as poucas formas que deslizar através das rachaduras, eu não quero que o genérico "hey olhar, ele fez isso no visual studio" ícone.
Uma solução é verificar tediosamente cada uma das minhas formas para se certificar de que quer ter um conjunto ícone personalizado ou têm set ShowIcon para Falso.
Outra solução é ter cada um de meus formulários herdar de uma classe base que define um ícone personalizado no construtor.
Além de essas soluções, que outras opções eu tenho?
EDIT: Eu estava esperando que seria uma forma de substituir a fonte do ícone do estoque com a minha própria. É em um lugar arquivo de recurso? Ou é incorporado em um .NET dll que eu não pode (ou realmente, realmente não deveria) modificar?
BOUNTY EDIT: Existe uma maneira de fazer isso sem editar ou escrever uma única linha de código? Eu não me importo como impraticável, complicado, resíduos de tempo, a solução é ... Eu só quero saber se é possível. Eu preciso para satisfazer a minha curiosidade.
Solução
O padrão ícone é incorporado nos winforms dll - olhando para reflector (DefaultIcon
) é:
defaultIcon = new Icon(typeof(Form), "wfc.ico");
Não há mágica lá que verifica outro local comum, para que você não pode fazê-lo sem alterar o código.
Você sempre pode abraçar as forças das trevas com reflexão baseada em campo? Nota: este é hacky e frágil. Em sua própria cabeça! Mas ele funciona:
[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);
}
}
Para fazê-lo corretamente; duas opções comuns;
- a classe base
Form
que tem o jogo do ícone - um método de fábrica
Form
- talvez algo como:
código:
public static T CreateForm<T>() where T : Form, new() {
T frm = new T();
frm.Icon = ...
// any other common code
return frm;
}
Então, em vez de:
using(var frm = new MySpecificForm()) {
// common init code
}
Algo como:
using(var frm = Utils.CreateForm<MySpecificForm>()) {
}
É claro - que não é muito mais bonita! Outra opção pode ser um método de extensão C # 3.0, talvez como uma API fluente:
public static T CommonInit<T>(this T form) where T : Form {
if(form != null) {
form.Icon = ...
//etc
}
return form;
}
e
using(var frm = new MySpecificForm().CommonInit()) {
// ready to use
}
Este é, então, apenas um .CommonInit()
longe do seu código existente.
Outras dicas
A opção de classe base é a que usamos.
Se você está procurando uma alternativa (não necessariamente bons), você pode: 1. Use COI para instanciar todas as suas formas e modificar o recipiente COI para definir o ícone do aplicativo. 2. Use AOP para inserir código em todas as formas que define o ícone do aplicativo.
Pessoalmente, eu tinha acabado de usar a classe base ...
A minha resposta útil:
Não
Seria um bom recurso para a Microsoft para implementar embora, desde a maioria dos aplicativos usar o mesmo ícone em todo o aplicativo.
Se você quiser atualizar todos os ícones por um outro, você pode construir um pequeno aplicativo que edita todos os arquivos * .Designer.vb (em vb.net) e adicionando a linha folowing para InitializeComponent:
Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico")
Hope isso ajuda.
Se todas as suas formas são em apenas um projeto, então você pode ter a dll do projeto e usar a reflexão para obter todo o tipo na dll. Se os deriva do tipo de formulário você pode definir o tipo de propriedade Ícone para o que quiser. Não estou certo de que a sobrecarga de desempenho será se o projeto é muito grande.