Как создать и показать окна WPF в отдельных потоках?

Преобразование аргумента в int. Это так же просто, как

int(argument)
34
задан Mikael Sundberg 10 July 2009 в 18:59
поделиться

2 ответа

Как 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();
}

РЕДАКТИРОВАТЬ: это старый ответ, но, поскольку кажется, что его часто посещают, я мог бы также подумать о следующих модификациях / улучшениях (не проверенных).

Если вы хотите закрыть такое окно, просто сохраните ссылку на окно объект извне потока (делегат), а затем вызвать 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
}

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: don ' Чтобы делать это дома, прерывание потоков (почти всегда) противоречит лучшим практикам. Потоки должны изящно обрабатываться с помощью любого из различных методов синхронизации или, в данном случае, просто через вызываемое окно . Close ()

50
ответ дан 27 November 2019 в 05:46
поделиться

Думаю, я нашел ответ. Посмотрите ответ Джона Скита на этот вопрос .

В основном вы делаете это в методе запуска потока:

private void ThreadStartingPoint()
{
    Window1 tempWindow = new Window1();
    tempWindow.Show();       
    System.Windows.Threading.Dispatcher.Run();
}
3
ответ дан 27 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: