2009-08-05 5 views
12

Puis-je modifier l'icône par défaut utilisée sur un Winform?Modifier l'icône Winform par défaut sur l'ensemble de l'application

La plupart de mes formulaires ont leur propriété d'icône définie sur une icône personnalisée. Pour les quelques formes qui passent entre les mailles du filet, je ne veux pas l'icône générique "hey look, it made this in visual studio".

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

Une autre solution consiste à faire hériter chacun de mes formulaires d'une classe de base qui définit une icône personnalisée dans le constructeur. En dehors de ces solutions, quelles autres options ai-je?

EDIT: J'espérais qu'il y aurait un moyen de remplacer la source de l'icône de stock par la mienne. Est-ce dans un fichier de ressources quelque part? Ou est-il intégré dans une DLL .NET que je ne peux pas (ou vraiment, ne devrait pas vraiment) modifier?

BOUNTY EDIT: Existe-t-il un moyen d'accomplir ceci sans modifier ou écrire une seule ligne de code? Je me fiche de savoir à quel point la solution est peu pratique, compliquée, perdue de temps ... Je veux juste savoir si c'est possible. J'ai besoin de satisfaire ma curiosité.

Répondre

24

Le par défaut icône est intégrée dans la dll WinForms - regardant réflecteur (DefaultIcon) est:

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

Il n'y a pas de magie là-dedans qui vérifie un autre emplacement commun, de sorte que vous ne pouvez pas faire sans changer de code.

Vous pourriez toujours embrasser les forces des ténèbres avec la réflexion sur le terrain? Note: c'est hacky et cassant. Sur ta propre tête! Mais cela fonctionne:

[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 l'icône mis
  • une méthode usine Form - 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; 
} 

Alors, 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 une API couramment:

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 
} 

C'est alors juste un .CommonInit() loin de votre code existant.

+0

Accepté pour trouver réellement l'icône ... assez proche –

+0

Ceci est absolument méga-cool. Je viens de me sauver de l'exécution de 50 formulaires ... –

+0

L'option de réflexion a bien fonctionné, et avec l'API de réflexion de la plateforme O2, le code pour le faire ne semble pas si effrayant typeof (Form) .fieldValue ("defaultIcon", SystemIcons .Bouclier); –

4

L'option de classe de base est celle que nous utilisons. Si vous cherchez une alternative (pas forcément bonne), vous pouvez: 1. Utiliser IOC pour instancier tous vos formulaires et modifier le conteneur IOC pour définir l'icône de l'application. 2. Utilisez AOP pour insérer du code dans tous les formulaires qui définissent l'icône de l'application.

Personnellement, je venais d'utiliser la classe de base ...

0

Si tous vos formulaires sont en un seul projet, alors vous pouvez prendre le dll du projet et utiliser la réflexion pour obtenir tous les types dans la dll. Si le type dérive de Form vous pouvez définir la propriété Icon du type à ce que vous voulez. Je ne suis pas sûr de ce que les frais généraux de performance seront si le projet est très grand.

1

Si vous souhaitez mettre à jour toutes les icônes par un autre, vous pouvez construire une petite application qui édite tous les fichiers * .Designer.vb (en vb.net) et en ajoutant la ligne à InitializeComponent que vous avez choisi:

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

J'espère que ça aide.

2

Ma réponse utile:

Pas

serait une fonctionnalité intéressante pour Microsoft à mettre en œuvre mais, puisque la plupart des applications utilisent la même icône dans l'application.

Questions connexes