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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top