2009-02-03 5 views
2

J'ai sous-classé un Treeview et à l'instanciation il charge une nouvelle ImageList (et les Images associées)..Net C# Design Voir les erreurs

Chaque fois que je passe à la vue concepteur, j'essaie également d'exécuter ce code, mais les images ne se trouvent pas dans le chemin du concepteur et se bloquent. J'ai fini par mettre un hack pour voir si le répertoire courant est "Visual Studio", alors ne rien faire ... mais c'est tellement moche. Je trouve que cela arrive pour d'autres choses. Si un contrôle essaie d'utiliser des objets pendant le chargement/l'initialisation qui ne sont disponibles que pendant l'exécution du programme, la vue de conception ne peut pas afficher le contrôle.

Mais y a-t-il un moyen de contourner ce problème?

Je suppose que ce que j'espère est d'avoir un essai/attraper pour le concepteur (seulement) avec la capacité d'ignorer quelques erreurs que je sais se produiront (comme FileNotFoundException, etc.).

Merci

Répondre

4

Tout ce qui hérite de System.Windows.Forms.Control a une propriété DesignMode qui renvoie une valeur booléenne indiquant si vous êtes en mode de conception ou non. Vous pouvez l'utiliser pour déterminer quand et quand ne pas charger les ressources externes.

1

Habituellement, il est préférable de déplacer le chargement de ces ressources vers une surcharge de OnLoad car elles sont rarement nécessaires directement à la construction. Cela corrige le problème que vous voyez et signifie que seuls les arbres qui sont affichés au moins une fois effectueront ces étapes de chargement de ressources supplémentaires. Sinon, vous pouvez simplement exclure ces étapes pendant la conception en cochant la propriété DesignMode et en agissant en conséquence.

1

Merci de m'avoir indiqué les bons directeurs.

J'avais essayé d'enregistrer à l'événement OnLoad, mais cet événement est déclenché lorsque la vue de conception apparaît, donc cela n'a pas fonctionné pour moi (est-ce que je fais quelque chose de mal?).

Quoi qu'il en soit, j'ai regardé un peu plus dans la propriété DesignMode. Il ne peut fonctionner que pour les contrôles, et parfois votre objet peut même ne pas être un contrôle.

Alors, voici la réponse que je préfère:

if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) { 
    // design-time stuff 
} else { 
    // run-time stuff 
} 

Je l'ai trouvé here.

1

C'est un motif à utiliser si vous créez une bibliothèque de contrôle avec un échantillon d'images quand il est affiché dans le concepteur ou avec d'autres fonctionnalités de conception, mais comme modèle de développement je ne suis pas sûr que ce soit très efficace .

Je vous suggère de déplacer votre "logique métier" (dans ce cas, le chargement de certaines images dans une arborescence) en dehors des limites de votre contrôle treeview. Dans votre cas, je mettrais la logique dans l'événement Load du formulaire que le contrôle est à l'intérieur:

public void Load(object sender, EventArgs e) 
{ 
    string path = "c:\somePath\toAwesome\Images"; 
    myFunkyTreeView.AddImages(path); 
} 

Pour les grandes applications, je pense personnellement que vous voulez changer la logique même hors des formes elles-mêmes, mais c'est mesure discutable car elle nécessite une plomberie supplémentaire comme un compromis pour la flexibilité que cela fournit.

+0

+1: sous-classement Les contrôles WinForms pour effectuer une logique de vue spécifique à l'entreprise se terminent toujours par un incident non supportable. Yuck. –