Les meilleures pratiques pour le multi-forme d'applications pour afficher et masquer les formes?
Il ya des tonnes de questions sur StackOverflow demandant comment masquer Form1 et de montrer Form2. Et, généralement, quelques réponses différentes cultures:
1)
//Program.cs
Application.Run(new Form1());
//Form1.cs
Form2 form2 = new Form2();
form2.Show();
this.Hide();
2)
//Program.cs
Form1 form1 = new Form1();
Form2 form2 = new Form2();
form1.Show();
form2.Show();
Application.Run();
...etc..
Je ne suis pas à la recherche d'un simple jetable solution comme #1. Je suis à la recherche de la meilleure forme de pratiques de gestion. Une application avec 5-8 formes, de l'ouverture et de la fermeture d'un autre fréquemment - quelle est la meilleure façon de gérer ces formes?
Mon idée était de faire de chaque forme a (paresseux?) Singleton et de les enterrer dans un FormsManager
classe quelconque (comme solution #2 mais ++). Et puis des formes pourrait appeler quelque chose comme FormsManager.GetForm<WelcomeDialog>()
.
Mais je me demandais ce que les gens avec plus d'expérience utilisé. Encore une fois, ces solutions ne devraient pas être rapide hacks. Ils devraient être orientée vers le design, peut-être architectural, et des solutions à long terme.
Modifications:
C'est plutôt une question générique (de sorte que les exigences sont assez ouvert) pour tous ceux qui pourraient avoir le même problème. Spécifique à ma situation si je n'ai pas besoin de multiples formes affiche au démarrage. Aussi, je n'ai pas de formulaires MDI. J'ai peut-être quelques formulaires modaux, mais ils sont pour la plupart non-modale.
Donc, je n'ai pas besoin de multiples formes affiche au démarrage. Une fois que l'application est lancée, le formulaire d'afficher/masquer la stratégie est simplement de multiples formes (non-MDI). Il y a peut être un ou deux formulaires modaux.
OriginalL'auteur Jason | 2012-02-27
Vous devez vous connecter pour publier un commentaire.
Je suis en répondant d'une manière générale ici.
Je ne pense pas que le pattern singleton irait bien avec la forme de gestion. En règle générale, vous souhaitez passer quelques paramètre de contexte pour la forme, et vous pouvez ouvrir plusieurs instances de la même forme. Donc un singleton n'est pas appropriée OMI.
Je pense que la gestion des formulaires devrait être simple.
Par exemple, si vous souhaitez afficher un formulaire modal à partir d'un autre formulaire, je voudrais écrire quelque chose de vraiment simple:
Bien sûr, vous pourriez écrire une partie de l'interface/les génériques de syntaxe pour éviter un peu de la duplication de code dans le cas où vous souhaitez afficher un grand nombre de formulaires modaux:
Mais honnêtement, j'ai l'impression que c'est un peu overingeneered.
Deuxième point: si votre formulaire n'est pas exactement suit ce comportement spécifique (
ShowDialog()
puis unResult
propriété est définie), alors vous devez écrire une autre Interface...etc.Si ce type de syntaxe (génériques, interfaces, etc...) ne pas réduire le nombre de lignes de code écrites OU de la complexité OU de la maintenabilité (et évidemment nous ne pouvons pas dire que c'est vraiment le cas ici), alors il est assez inutile de l'OMI.
Edit:
Forme de gestion dépend vraiment de votre cas d'utilisation.
FormManager
concept (ou mieux: réfléchir sur la façon d'améliorer l'expérience de l'utilisateur en réduisant le nombre de possible ouvert formes)Généralement, la forme qui est utilisée pour démarrer l'application (c'est à dire la forme que s'arrête le programme lors de la fermeture, qui est la forme qui est un paramètre de
Application.Run()
) est responsable d'autres formes. Vous avez un formulaire principal, et des multiples formes d'enfants. Si votre cas est très différent, il n'y a probablement quelque chose de plus intelligent à écrire, mais ça dépend de votre cas. Je ne pense pas que l'on peut fournir une bonne réponse à la problématique générale de la gestion des formulaires.Honnêtement, si vous voulez quelque chose de vraiment facile à gérer, essayez de les réduire (autant que possible) le nombre de formulaires qui peuvent être affichées en même temps. Plusieurs affiché non modale des formes en même temps ne pas offrir une bonne expérience de l'utilisateur dans la plupart des cas, et de la forme de gestion du cycle de vie peut être problématique si les formes sont dépendantes les unes des autres.
Voir édité répondre
Notez que WinForms a une classe de base pour le problème général de gestion de formulaire:
ApplicationContext
OriginalL'auteur ken2k
Dans rien d'autre que le plus simple est le scénario-un seul formulaire principal en cours d'exécution pour la durée de vie de l'application, avec une courte durée de vie de l'enfant formes, il est recommandé de créer une classe qui hérite de
ApplicationContext
. Elle n'est pas compliquée:et
Application.Run
dansProgram.cs
pouvez utiliser l'instance statique deFormManager
:Au cours de la durée de vie de l'application, de nouvelles formes devraient être créés via
CreateForm
, dans le but d'enregistreronFormClosed
méthode avec leFormClosed
événement:Si vous préférez
new Form3();
sur les appels àFormManager.CreateForm
, vous pouvez créer unRegisterForm
méthode surFormManager
:et appel
RegisterForm
sur chaque nouvelleForm
:(NB. Si tous vos formulaires hériter de certains de la classe de base, alors au lieu de saisir manuellement l'appel de
RegisterForm
pour chaque nouvelle instance, vous pouvez l'appeler dans le constructeur de classe de base.)Noter que
Application.OpenForms
ne renvoie que ces formes qui sont actuellement visibles. Si l'application ne devrait pas sortir tant qu'il y a encore des formes cachées de l'ouvrir, puisFormManager
devez collection de garder une trace de toutes les formes. Cette collection permettra de déterminer si pour quitter l'application ou non.J'ai développé ma réponse.
Cela a été très utile, merci
OriginalL'auteur Zev Spitz
- Je utiliser cette astuce. Disons form1 est la principale forme:
Donc; lorsque vous ouvrez un formulaire fermée (à l'exception de form1), form1 réapparaîtra à nouveau.
Mise à jour
Dans ce cas, il n'est pas besoin de cacher forme précédente.
Non, pas besoin de le faire dans toutes les autres formes, d'autres peuvent envoyer des messages, dialogresult, les données à mainform peut poignées de charger droit de formes, sauf si "Showdialog" : voir la mise à jour
Je ne comprends pas ce que tu veux dire. Il semble que votre code de ré-ouvre le caché Form1 une fois Form2, Form3, ou quelle que soit la Forme est fermée. Mais c'est un facteur limitant. Form1 peut être nécessaire d'ouvrir Form5. Form5 peut être nécessaire d'ouvrir Form3. Form3 peut-être besoin pour ouvrir leurs formes7. Je ne crois pas que votre solution est très extensible.
J'utilise Form2 dans mon code comme exemple brother, vous pouvez charger n'importe quelle Forme: LoadForm(nouveau someForm());
Souhaitez-vous utiliser votre solution dans une application d'entreprise?
OriginalL'auteur Amen Ayach
En fonction de la taille de votre application, Id dire avoir un regard sur Microsoft Enterprise library et plus précisément de la CABINE bloc.
Qui devrait vous donner un bon départ.
OriginalL'auteur Steoates
si vous avez plus de deux formulaire, puis créer un autre formulaire comme From2
OriginalL'auteur Jagdish