As msdn состояния:
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:
Это старый ответ, но так как его часто посещают, я мог бы подумать о следующих модификациях / улучшениях (не тестировалось).
Если вы хотите закрыть такое окно, просто сохраните ссылку на объект Window снаружи потока (делегата), а затем вызовите close для него, что-то вроде этого:
void CloseWindowSafe(Window w)
{
if (w.Dispatcher.CheckAccess())
w.Close();
else
w.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(w.Close));
}
// ...
CloseWindowSafe(tempWindow);
Если новый поток может быть прерван (принудительно прерван), в соответствии с вопросом в комментариях:
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
}
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: не делайте этого дома, прерывание потоков (почти всегда) противоречит лучшим практикам. Потоки должны корректно обрабатываться с помощью любого из различных методов синхронизации, или в этом случае, просто с помощью вызванного window.Close()