WPF で「DependencyObject と同じ Thread 上で作成する必要があります。」と怒られたときに解決する方法

C#

WPF でアプリ作成時、実行すると

DependencyObject と同じ Thread 上で作成する必要があります。

という例外が発生した件について、その解決策を残しておきます。
日本語であまり情報がなかったので・・・

背景

WPF で以下のように ViewModel を作成しました。

// 抜粋

public IReactiveProperty<string> Hoge { get; } = new ReactiveProperty<string>("hoge !");

someObservable.Subscribe<bool>(x => 
{
  Hoge.Value = x ? "hoge だ!" : "hoge ではない!";
})

xaml 側で Hoge.Value を Binding しており、someObservable の状態が変わったら、その表示文字列を変えるといったものです。

ここで、someObservable が UI スレッドとは異なるスレッドからイベント発行したときに、上記の例外が発生しました。

原因

つまり、UI スレッドとは異なるスレッドから発行されたイベントをサブスクライブして、何かしら UI の制御を行おうとすると、上記例外が発生するみたいです。

よくあるやつですね・・・><

解決方法

こちらの自動翻訳のページに答えがありました。

結果的に、上記ソースを以下のように Application.Current.Dispatcher.Invoke を使うと解決しました。

// 抜粋

public IReactiveProperty<string> Hoge { get; } = new ReactiveProperty<string>("hoge !");

someObservable.Subscribe<bool>(x => 
{
  Application.Current.Dispatcher.Invoke(() =>
  {
    Hoge.Value = x ? "hoge だ!" : "hoge ではない!";
  });
});

コメント

タイトルとURLをコピーしました