Comme msdn états:
private void NewWindowHandler(object sender, RoutedEventArgs e)
{
Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
}
private void ThreadStartingPoint()
{
Window1 tempWindow = new Window1();
tempWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}
EDIT: C'est une ancienne réponse, mais comme il semble être visité souvent, je pourrais aussi penser des modifications/améliorations suivantes (non testé).
Si vous souhaitez fermer une telle fenêtre, il suffit de garder une référence à l'objet de la fenêtre à l'extérieur du fil (délégué), puis invoquer près, quelque chose comme ceci:
void CloseWindowSafe(Window w)
{
if (w.Dispatcher.CheckAccess())
w.Close();
else
w.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(w.Close));
}
// ...
CloseWindowSafe(tempWindow);
Si le nouveau thread pourrait devenir terminé (interrompu de force), conformément à la question dans les commentaires:
private void ThreadStartingPoint()
{
try{
Window1 tempWindow = new Window1();
tempWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}
catch(ThreadAbortException)
{
tempWindow.Close();
System.Windows.Threading.Dispatcher.InvokeShutdown();
}
//the CLR will "rethrow" thread abort exception automatically
}
AVERTISSEMENT: ne pas le faire à la maison, fils est l'interruption (presque toujours) des meilleures pratiques. Les threads doivent être manipulés gracieusement via l'une des différentes techniques de synchronisation, ou dans ce cas, simplement via un window.Close()
Grande Comment puis-je fermer une fenêtre créée de cette façon –
je sais que c'est une question ancienne mais cette approche encore Je n'ai qu'un seul problème - je l'utilise pour le chargement de la fenêtre - Montrer la fenêtre de chargement dans un nouveau fil -> faire des trucs -> newThread.Abort() et c'est ok mais si je le fais à nouveau il plante l'application entière. – MajkeloDev
Salut, je me débattais avec ça aussi, pour moi, ça [link] (https://dontpaniclabs.com/blog/post/2013/11/14/dynamic -splash-screens-in-wpf /) a fonctionné.Cela utilise ManualResetEvent-way.Il y a une source à télécharger et vérifiez aussi (GitHub) – dba