2009-03-19 5 views
2

En supposant deux projets, un projet WinForms et un projet WPF, dans les WinForms projet, il n'y a aucun problème avec le code suivant étant en Main() et le retrait du Application.Run:WPF ne peut ouvrir qu'une seule fenêtre?

 while (true) 
     { 
      Thread.Sleep(1000); 
      Form1 window = new Form1(); 
      window.Show(); 
      Thread.Sleep(1000); 
      window.Close(); 
     } 

Cependant, dans le WPF l'application, la suppression du StartupUri = « Window1.xaml » puis la création:

public App() 
    { 
     while (true) 
     { 
      Thread.Sleep(1000); 
      Window window = new Window(); 
      window.Show(); 
      Thread.Sleep(1000); 
      window.Close(); 
     } 
    } 

les boucles de programme indéfiniment, mais la fenêtre ouvre seulement une fois?

Répondre

8

Vous devez changer la ShutdownMode comme tant

public App() 
{ 
    this.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
    while (true) 
    { 
     Thread.Sleep(1000); 
     Window window = new Window(); 
     window.Show(); 
     Thread.Sleep(1000); 
     window.Close(); 
    } 
    //Will never get here with this sample code, 
    //but this would be how you close the app. 
    this.Shutdown(); 

} 

traite Sinon WPF fermer la première fenêtre ouverte comme la fermeture de l'application. Bien que le code dans la boucle continuera à fonctionner.

La durée de vie de certaines applications peuvent pas dépendre lorsque la fenêtre principale ou la dernière fenêtre est fermée, ou peut ne pas dépendre de fenêtres à tous. Pour ces scénarios, vous devez définir la propriété ShutdownMode sur OnExplicitShutdown, ce qui nécessite un appel de méthode explicite Shutdown pour arrêter l'application . Sinon, l'application continue de s'exécuter dans l'arrière-plan .

MSDN:ShutdownMode Property

+0

Merci! J'ai rencontré ce problème en affichant une boîte de dialogue de connexion modale, puis en quittant WPF sans message ou exception avant l'affichage de la fenêtre principale. –

0

Traditionnellement si vous supprimez le StartupUri vous devez charger le MainWindow en cas Application.Startup

public App() 
{ 
    Startup += App_Startup 
} 

public void App_Startup(object sender, StartupEventArgs e) 
{ 
    while (true) 
    { 
    Thread.Sleep(1000); 
    MainWindow = new Window(); 
    MainWindow.Show(); 
    Thread.Sleep(1000); 
    MainWindow.Close(); 
    } 
} 

Bien que, je ne sais pas si cela va fonctionner soit. Qu'est-ce que vous essayez de faire exactement?

+0

qui ne fonctionne pas non plus. Et les arguments de l'événement Startup prennent StartupEventArgs. – Ray

+0

Rien de méchant, sur un fil séparé je vérifie si un fichier .XAML a été mis à jour. Si je veux recharger la fenêtre principale en utilisant XamlReader.Load (fileStream); – Paul

Questions connexes