0

Prism の を使用して、複数のイベントがサブスクライブされる出力ウィンドウを作成しましたEventAggregator。これまでのところ、コンストラクターは 2 つの異なるイベントを処理しています。

public OutputWindowView(IEventAggregator eventAggregator)
{
    eventAggregator.GetEvent<LoginStatusEvent>().Subscribe(trackLogin, true);
    eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, true);

    this.InitializeComponent();
}

SetTextどちらのイベントも、メソッドを介して同じ UI コンポーネントをターゲットにしています。

private void trackLogin(LoginStatus s)
{
    SetText("Connected: " + s.IsConnected.ToString());
}

private void trackMessage(string s)
{
    SetText(s);
}

スレッド エラーを回避するためにデリゲートを作成しようとしています。

private delegate void SetOutputText(string content);

private void SetText(string content)
{

    Trace.WriteLine("===== SetText =====");

    var text = content + Environment.NewLine;

    if (this.txtOutput.Dispatcher.CheckAccess() == false)
    {
        Trace.WriteLine("->CheckAccess > false");
        SetOutputText _output = new SetOutputText(SetText);
        this.Dispatcher.Invoke(_output, text);
    }
    else
    {
        Trace.WriteLine("->CheckAccess > true");
        this.txtOutput.Text += text;
    }

}

出力ホバーは次のとおりです。

===== SetText =====
->CheckAccess > false
===== SetText =====
->CheckAccess > true

出力は次のようになると思います。

===== SetText =====
->CheckAccess > false

また

===== SetText =====
->CheckAccess > true

しかし、2回呼び出されているようです。

4

1 に答える 1

1

ThreadOption.UIThreadこのように渡すことで、UI スレッドでサブスクライブできます

eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, ThreadOption.UIThread, true);

INotifyPropertyChangedイベントは自動的に UI スレッドにマーシャリングされる ため、viewmodel のプロパティにバインドするだけで完了です。

于 2016-05-31T14:36:57.553 に答える