私は UserControl を再利用しようとしていますが、進行状況を追跡するロジックも借りています。物事を単純化しようとします。MyWindow.xaml には MyUserControl が含まれています。MyUserControl には独自の進行状況インジケーター (フォーマット中...、ファイルのコピー中... など) があり、この進行状況を MyWindow フォームのどこかにミラーリングしたいと思います。しかし、ユーザー コントロールには、よくわからないロジックがあります。何度も読みましたが、まだ Dispatcher を理解していません。進行状況を更新するユーザー コントロールのロジックの概要を次に示します。
this.Dispatcher.Invoke(DispatcherPriority.Input, (Action)(() =>
{
DAProgressIndicator = InfiniteProgress.AddNewInstanceToControl(StatusGrid, new SolidColorBrush(new Color() { A = 170, R = 128, G = 128, B = 128 }), string.Empty);
DAProgressIndicator.Message = MediaCardAdminRes.ActivatingCard;
ActivateInProgress = true;
}));
私は賢いと思い、ActivateInProgress プロパティ セット ロジックで呼び出される MyUserControl にイベントを追加しました。
public bool ActivateInProgress
{
get
{
return _activateInProgress;
}
set
{
_activateInProgress = value;
if (ActivateInProgressHandler != null)
{
ActivateInProgressHandler(value);
}
}
}
MyWindow コンストラクター内の ActivateInProgressHandler を、ウィンドウ自体の進行状況インジケーターに使用されるビュー モデル プロパティを設定する次のメソッドに設定しています。
private void SetActivation(bool activateInProgress)
{
viewModel.ActivationInProgress = activateInProgress;
}
ただし、ウィンドウの進行状況インジケーターは変化しません。だから、私は Dispatcher.Invoke が私が理解できないことをしていると確信しています。SetActivation メソッド内にメッセージ ボックスを配置すると、スレッドがブロックされ、ウィンドウの進行状況インジケーターが更新されます。基本的なスレッドは理解していますが、この Dispatcher 全体は初めてです。私は何が欠けていますか?
更新: 現在は機能しているようです。進行状況が非常に速く更新されたため、画面に表示されなかったことが判明しました。しかし、なぜ Dispatcher.Invoke が実行されたのかを理解したいと思います (これは私が書いていない既存のコードでした)。アクションの内容が *.xaml.cs コードの残りの部分と一致しないのはなぜですか?