Question

Puis-je changer l'icône par défaut utilisée sur un Winform?

La propriété icon de la plupart de mes formulaires est définie sur une icône personnalisée. Pour les quelques formulaires qui se glissent entre les mailles du filet, je ne veux pas du générique "hé look, il l'a fait dans Visual Studio". icône.

Une solution consiste à vérifier minutieusement chacun de mes formulaires pour s'assurer qu'ils ont soit un jeu d'icônes personnalisé, soit que ShowIcon est défini sur False.

Une autre solution consiste à faire en sorte que chacun de mes formulaires hérite d'une classe de base qui définit une icône personnalisée dans le constructeur.

Mis à part ces solutions, quelles autres options ai-je?

MODIFIER: J'espérais qu'il serait possible de remplacer la source de l'icône stock par la mienne. Est-ce que c'est dans un fichier de ressources quelque part? Ou est-il intégré dans une dll .NET que je ne peux pas (ou ne dois vraiment pas) modifier?

BOUNTY EDIT: Y a-t-il un moyen d'accomplir cela sans éditer ni écrire une seule ligne de code? Je me fiche de la difficulté, de la complexité et de la perte de temps de la solution ... Je veux juste savoir si c'est possible. J'ai besoin de satisfaire ma curiosité.

Était-ce utile?

La solution

L’icône default est incorporée dans la dll winforms - en regardant le réflecteur ( DefaultIcon ), c’est:

defaultIcon = new Icon(typeof(Form), "wfc.ico");

Il n'y a pas de magie qui vérifie un autre emplacement commun, vous ne pouvez donc pas le faire sans changer de code.

Vous pouvez toujours embrasser les forces des ténèbres avec une réflexion basée sur le champ? Note: c'est hacky et fragile. Sur ta propre tête! Mais ça marche:

[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);
    }
}

Pour le faire correctement; deux options communes;

  • une classe de base Form qui a le jeu d'icônes
  • une méthode Form en usine - peut-être quelque chose comme:

code:

public static T CreateForm<T>() where T : Form, new() {
    T frm = new T();
    frm.Icon = ...
    // any other common code
    return frm;
}

Puis au lieu de:

using(var frm = new MySpecificForm()) {
    // common init code
}

Quelque chose comme:

using(var frm = Utils.CreateForm<MySpecificForm>()) {

}

Bien sûr, ce n’est pas beaucoup plus joli! Une autre option pourrait être une méthode d’extension C # 3.0, peut-être comme une API fluide:

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

et

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

Il ne s’agit alors que de .CommonInit () de votre code existant.

Autres conseils

L'option de classe de base est celle que nous utilisons.

Si vous recherchez une alternative (pas forcément bonne), vous pouvez: 1. Utilisez IOC pour instancier tous vos formulaires et modifiez le conteneur IOC pour définir l'icône de l'application. 2. Utilisez AOP pour insérer du code dans tous les formulaires définissant l'icône de l'application.

Personnellement, je n'utiliserais que la classe de base ...

Ma réponse utile:

Non

Ce serait une fonctionnalité intéressante à mettre en œuvre par Microsoft, car la plupart des applications utilisent la même icône sur l’ensemble de l’application.

Si vous souhaitez mettre à jour toutes les icônes, vous pouvez créer une petite application qui édite tous les fichiers * .Designer.vb (en vb.net) et en ajoutant la ligne suivante à InitializeComponent:

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

J'espère que ça aide.

Si tous vos formulaires sont dans un seul projet, vous pouvez utiliser la DLL du projet et utiliser la réflexion pour obtenir tous les types dans la DLL. Si le type provient de Form, vous pouvez définir la propriété Icon du type sur ce que vous voulez. Je ne sais pas quel sera le surcoût lié aux performances si le projet est très volumineux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top