2010-12-10 19 views
2

En .NET (langage: C#) lors de l'écriture des applications Windows, nous commençons l'application avec un formulaire passé à Application.Run..NET Login et Splash Screens quoi mettre dans Application.Run

Mais quand vous avez une application où vous n'avez pas une seule fenêtre pour la garder en vie ... Mais plutôt si l'un des types de formulaires est actif, vous ne voulez pas que l'application reste.

Ce que j'ai, par ex. un écran de connexion que lorsque l'utilisateur se connecte avec succès, je ne veux pas fermer. Toutefois, l'appel de "Close()" ferme évidemment l'application entière puisque l'écran de connexion est celui passé à Application.Run.

L'écran suivant a le même "sort" donc ne peut pas l'utiliser non plus, ce sera un écran où l'utilisateur sélectionne quelque chose, puis il se ferme.

En tout cas ... longue histoire courte. J'ai quelques idées, mais toutes impliquant des choses pas si nettes. Donc, ce que je demande ici est une sorte de «meilleure pratique» dans ces cas. Ce n'est pas quelque chose de définitif, je le sais, alors s'il vous plaît toutes les bonnes idées sont les bienvenues et les discussions autour d'eux.

+1

suis tombé sur ce: http://www.codeproject.com/KB/cs/applicationcontextsplash.aspx On dirait une manière raisonnable, mais je vais devoir regardez-y un peu plus pour voir comment je peux le pousser dans mon implémentation avec IoC et Navigators ... C'est la route que je vais parcourir maintenant ... Mais gardez les idées qui circulent. – Jens

Répondre

0

L'article Code Project a fini par être la base de la solution (comme c'est le cas maintenant).

Il reste encore quelques parties à trier dans la partie "Navigateur", mais le remplacement du contexte fonctionne parfaitement.

L'essence de la mise en œuvre:

public class ApplicationContextNavigator : ApplicationContext, INavigator 
{ 
    private readonly IWindsorContainer container; 
    private IView Current { ... } 
    public ApplicationContextNavigator(IWindsorContainer container) {...} 
    public void Start<TView>() where TView : IView { ... } 
    public void Start<TView>(IViewInitializer initializer) where TView : IView 
    { 
    Current = InitializeView<TView>(initializer); 
    Application.Run(this); 
    } 

    public void Navigate<TView>() where TView : IView { ... } 
    public void Navigate<TView>(IViewInitializer initializer) where TView : IView 
    { 
    IView closing = Current; 
    IView showing = InitializeView<TView>(initializer); 

    showing.Location = closing.Location; 
    showing.Show(); 

    Current = showing; 
    closing.Close(); 
    } 

    private IView InitializeView<TView>(IViewInitializer initializer) where TView : IView 
    { 
    IView view = container.Resolve<TView>(); 
    initializer.Initialize(view); 
    return view; 
    } 

    protected override void OnMainFormClosed(object sender, EventArgs e) 
    { 
    if(sender == Current) 
    { 
     base.OnMainFormClosed(sender, e); 
    } 
    } 
} 
0

Créez une fonction principale dans laquelle vous créez les fenêtres (et affichez-les). Pour cela vous devez définir que l'application ne doit pas être terminée lorsque la fenêtre principale ou la dernière fenêtre est fermée

+0

Comme formulé ici, c'est plus une répétition de ma question, ce que vous dites est essentiellement ce que je ne veux pas faire, mais j'ai trouvé quelque chose sur le comment: http://www.codeproject.com/KB/cs/ applicationcontextsplash.aspx – Jens