0

WPF Toolkitが提供する MessageBox を使用しています。そして、私はエラーが発生します

多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。

new Thread(new ThreadStart(delegate
{
    MessageBox.Show("Opeartion could not be completed. Please try again.","Error",MessageBoxButton.OK,MessageBoxImage.Error);
})).Start();

この場合、ApartmentState を設定するにはどうすればよいですか

編集:WPF Toolkit の MessageBox コントロールを使用してモードレス MessageBox を表示しようとしています。これまでのところ、私が持っているコードは次のとおりです。

void SomeFunction()
{
// calls to some UI, and processing and then

var th = new Thread(new ThreadStart(delegate
                                        {
                                           MessageBox.Show("Opeartion could not be completed. Please try again.",
                                                "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                                        }));

                                        th.SetApartmentState(ApartmentState.STA);
                                        th.Start();
                                    }
}
4

2 に答える 2

0
// enable unit test to mock a dispatcher
var dispatcher = Dispatcher.CurrentDispatcher;
if (Application.Current != null)
{
    // use the application dispatcher if running from the software
    dispatcher = Application.Current.Dispatcher;
}

if (dispatcher != null)
{
    // delegate the operation to UI thread.
    dispatcher.Invoke(
        delegate
        {
            MessageBox.Show("Opeartion could not be completed. Please try again.","Error",MessageBoxButton.OK,MessageBoxImage.Error);
        });
}
于 2015-11-12T03:43:43.603 に答える
-1

編集済み

MSDNによるとWPF には組み込みのモーダル MessageBox が存在しますが、Modeless MessageBox を使用する場合は、カスタム ウィンドウを作成して表示する必要があります。カスタム モードレス MessageBox から値を作成、表示、および返すことは、それほど難しいことではありません。このリンク を見ることができます

メッセージボックスだけに別のスレッドを使用するのは賢明ではありません。とにかく、次の方法で単一のアパートの状態を設定できます...

  Thread th = new Thread(new ThreadStart(delegate
  {
    MessageBox.Show("Opeartion could not be completed. Please try again.", "Error",MessageBoxButtons.OK,MessageBoxImage.Error);
  }));

  th.ApartmentState = ApartmentState.STA;
  th.Start();
于 2012-05-24T07:39:40.937 に答える