WPFのWindowから特定のイベントを受け付け、別プロジェクトのWindowを表示しようとしたときにこのExceptionが発生した。
private void ViewHandler(object sender, NotifyEventArgs e) { MainWindow window_ = null; try { window_ = new MainWindow(); } catch (Exception ex) // 呼び出しスレッドは、多数の UI コンポーネントが必要としているため、STA である必要があります。 { logger.Error("Something wrong happened.", ex); } }
イベント処理の結果実行されるメソッドがMain Threadで動作していなかったので、STAスレッドになっていなかったことが原因。
var th= new Thread(new ThreadStart(threadMethod)); th.SetApartmentState(ApartmentState.STA); th.Start();
で、STAスレッドが作れると書いてあったので試してみたけど、途中で
このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。
が発生。呼び出し元のWindowの操作を行っているようなので呼び出し元のWindowの参照コストラクタで渡して 処理をそのWindowのスレッド内でDispatchするように書き直したら動いた。
window.Dispatcher.Invoke(() => { Notify() });