5

私は非常に複雑な UI を持っており、複数の種類のステータス メッセージを含むステータス バーが絶えず変化し、UI には複雑なチャート コントロールと地理的な地図が読み込まれています。

現在、これらの小さくても複雑な領域のデータ コンテキストには、StatusBarVM、ChartingVM、GeoMapVM などの同じように複雑な ViewModels があります。これらは、INotifyPropertyChanged と ObservableCollections を実装しています。

更新を計算すると、約 5000 個の UI アイテム (ラベル、プログレスバー、チャート データ ポイント、bgcolorsbrushes など) があり、1 秒あたり 1000 個のデータ アイテム更新という高速で変化しています。

WPF UI でこの一括データ更新を実現する最善の方法は何ですか?

WPF のバインディング モデルは、このような大規模な更新に対応できますか? もしそうなら、どのように?私の場合は最適ではないことがわかったからです。私はbgworker(プログレスバー用)も使用しており、DIspatcher BeginInvokeを使用しています...しかし、ポイントは、ディスパッチャーメッセージがキューに入れられて終了するのを待っているため、更新によってUIスレッドがハングすることです。

ステータスがリアルタイムであるため、仮想化を実装できず、目の前の UI でそれらすべてを確認する必要があります.数秒でもそれらを見逃すわけにはいきません (たとえば、絶えず変化する衛星の地理データ)。

複雑で応答性の高い WPF UI を実現するための正しいツールまたは何らかの方法を特定するのを手伝ってください。Dispatcher.PushFrame() ですか?

4

1 に答える 1

4

1 秒あたりの更新数が多いため、更新メッセージがキューに「バックアップ」されるため、バックグラウンド ワーカーの更新がブロックされます。

これを解決するには、スローされる更新イベントの数を調整する必要があります。

私は次のようなアプローチを使用します:

私の ViewModel では、INotifyPropertyChanged の通常の実装を、そのオブジェクトに代わって通知を送信するシングルトン オブジェクトへの呼び出しに置き換えます。

private void OnPropertyChanged(string propertyName)
{
    PropertyChangedNotifier.Notify(this, propertyName, propertyChanged);
}

propertyChangedこのオブジェクトのイベント ハンドラーを格納するメンバー変数はどこにありますか。

メソッドは次のNotifyようになります。

public static void Notify(
    object sender, 
    string propertyName, 
    PropertyChangedEventHandler handlers)
{ ... }

Notifier 内では、イベントをすぐに送信しないでください。送信する必要があるという事実だけを保存してください。

同じオブジェクト/プロパティについて複数回通知を受け取った場合は、余分な通知を破棄してください。同じオブジェクトでプロパティが異なる通知を何度も受け取る場合は、通知をすべてのプロパティに対して 1 つの通知に置き換えます。

ここで、UX スレッド タイマーを使用して、50 ミリ秒ごとに通知を「解放」します。それでも、ユーザーが違いに気付かないほど十分に速く、リアルタイムの更新のように見えますが、重複した通知を検出 (および削除) するには十分遅いです。

于 2011-07-17T19:36:13.077 に答える