Подтвердить что ты не робот

Вызывающий поток должен быть STA, потому что многие компоненты пользовательского интерфейса требуют этого в WPF

Мой сценарий:

   void Installer1_AfterInstall(object sender, InstallEventArgs e)
    {
        try
        {         

              MainWindow ObjMain = new MainWindow();               
              ObjMain.Show();              
        }
        catch (Exception ex)
        {
            Log.Write(ex);
        }
    }

Я получил ошибку "Вызывающий поток должен быть STA, потому что многие компоненты пользовательского интерфейса требуют этого"

что я делаю?

4b9b3361

Ответ 1

Обычно метод точки входа для потоков для WPF имеет [STAThreadAttribute] для ThreadMethod или имеет состояние квартиры, установленное в STA при создании потока, используя Thread.SetApartmentState(). Однако это можно установить только до начала потока.

Если вы не можете применить этот атрибут к точке входа приложения потока, из которого вы выполняете эту задачу, попробуйте следующее:

void Installer1_AfterInstall(object sender, InstallEventArgs e)
{
    var thread = new Thread(new ThreadStart(DisplayFormThread));

    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
}

private void DisplayFormThread()
{
    try
    {
        MainWindow ObjMain = new MainWindow();
        ObjMain.Show();
        ObjMain.Closed += (s, e) => System.Windows.Threading.Dispatcher.ExitAllFrames();

        System.Windows.Threading.Dispatcher.Run();
    }
    catch (Exception ex)
    {
        Log.Write(ex);
    }
}

Ответ 2

У меня была эта ошибка раньше, и самый простой способ - Dispatcher.
 См. Мои Question и answer

Удача