8
votes

Appliquer des modifications à la formulaire MainForms Form.icon au moment de l'exécution

J'ai un système.windows.Forms.Form et souhaitez modifier le formulaire.icon au moment de l'exécution pour afficher un statut. J'ai réussi à charger l'icône des projets Ressources: xxx

mais l'icône affichée reste la même (icône du temps de conception) tout le temps. Dois-je appeler une méthode pour indiquer au formulaire d'appliquer des modifications? Quelque chose ne va pas sur mon utilisation de formulaire.icon?


0 commentaires

4 Réponses :


1
votes

Oui, vous devez modifier l'icône chaque fois que l'état de votre application change.

J'ai testé cela avec une simple application WinForm: p> xxx pré>

lorsque le programme est en cours d'exécution, cliquez sur chaque bouton changera l'icône de formulaire (et, bien sûr, l'icône dans la barre des tâches) dans l'icône spécifiée. Je viens de choisir quelques icônes de l'ensemble qui est livré avec Visual Studio et l'a ajouté au fichier de ressources du projet. P>

Vous devez être capable d'ajouter une méthode simple que vous pouvez appeler n'importe où dans votre code qui définit l'icône qui définit l'icône. (Et vous pouvez aussi l'appeler de form_load également): P>

private void ChangeIconStatus(string statusText)
{
    Type type = this.GetType();
    System.Resources.ResourceManager resources =
    new System.Resources.ResourceManager(type.Namespace + ".Properties.Resources", this.GetType().Assembly);
    this.Icon = (System.Drawing.Icon)resources.GetObject(type.Namespace + ".Icons." + statusText + ".ico");
}


0 commentaires

14
votes

On ne sait pas pour moi pourquoi vous faites cela la solution difficile. Il suffit d'ajouter l'icône à vos ressources. Projet + Propriétés, onglet Ressources, flèche ON ADD RESSOURCE BOUTON, Ajouter un fichier existant. Ensuite, vous l'utiliseriez comme ceci à l'exécution:

    private void button1_Click(object sender, EventArgs e) {
        this.Icon = Properties.Resources.Mumble;
    }


4 commentaires

Salut Hans, il existe un problème de coulée de type dans le code ci-dessus (le bitmap ne peut pas être converti en type icon, je suppose). Désolé.


@Siva, Hans échantillon travaux sans couler pour moi. Peut-être que vous n'avez pas ajouté votre Ressource comme une icône?


Merci, je reçois un statutext (String) et mettez les icônes dans mes ressources. Je veux les charger via le statutext (pour être flexible pour ajouter un autre statut et icône). Votre approche fonctionne, mais n'est pas flexible ... je dois donc vérifier, ce que je fais mal, lors du chargement du Ressource ...


@HANS Il y a au moins deux raisons pour lesquelles cela est la "voie difficile": (1) commutation entre plusieurs icônes et (2) en raison de l'antipathie contre les concepteurs (mon favori).



3
votes

Je suppose, tout d'abord, votre getObject (...) renvoie null. C'est la raison pour laquelle la coulée de type se termine silencieusement ni une erreur de lancer ni changer l'icône.

Au lieu de cela, si possible, utilisez xxx

surcharge puis essayez.


1 commentaires

Ok, ça ne me dérange pas, maintenant je l'ai eu: j'ai copié la merde de l'espace de noms entière au nom de la Ressource d'un autre échantillon, qui m'a eu NULL pour le getObject () ... cela fonctionne de cette façon: cela.icon = (système. Dessiner.icon) ressources.getObject (statutext);



5
votes

OK, SIVA et HANS Où est correct: GetObject retourné null, car le nom du Ressource n'était pas correct. Avec le changement suivant, cela fonctionne:

Type type = this.GetType(); 
System.Resources.ResourceManager resources = 
new System.Resources.ResourceManager(type.Namespace + ".Properties.Resources", this.GetType().Assembly);

// here it comes, call GetObject just with the resource name, no namespace and no extension
this.Icon = (System.Drawing.Icon)resources.GetObject(statusText); 


1 commentaires

En fait, vous utilisez l'espace de noms, mais c'est le nom de la classe dont vous avez besoin avant ".properties.resources".