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

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

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

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

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

что я делаю?

Ответы [ 2 ]

24 голосов
/ 15 ноября 2010

Обычно метод точки входа для потоков для 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);
    }
}
4 голосов
/ 07 марта 2011

У меня была эта ошибка раньше, и самый простой способ - использовать Диспетчер .
Смотрите мой Вопрос и answer

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...