web-dev-qa-db-ja.com

UIスレッドのDispatcherを取得するにはどうすればよいですか?

UI要素への参照がないときにUIスレッドのDispatcherを取得する方法はありますか?

50
Peter

静的アプリケーションインスタンスからUIディスパッチャーを取得できます:Application.Current.Dispatcher

Application.Currentは、シャットダウンシーケンス中にクリアできるため、最初はnullです。

94
Abe Heidebrecht

以下は、たまたまWPF(私の場合はEsriのArcmap.exe)を使用しているWinFormsアプリケーションで使用すると、私にとってははるかにうまく機能します。

_private System.Windows.Threading.Dispatcher Dispatcher { get; set; }

// I put this in my view model constructor as it MUST be called from UI thread
Dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher;
_

他のメソッド(new System.Windows.Application()を呼び出して_System.Windows.Application.Current_を設定する方法)は、新しいWPFウィンドウを開いてから閉じるたびに問題を引き起こしました。これは_System.Windows.Application.Current_をnullにしただけでなく、InitializeComponents()メソッドとして新しいウィンドウを開くことができなくなりました。

System.InvalidOperationException:「アプリケーションオブジェクトがシャットダウンされています。」

これまでのところ、新しいソリューションはこれらの副作用なしで機能しています。

2
M Townsend