0

オプションがクリックされたときにコンテンツ(MetroContentControl)領域にユーザーコントロール(グリッド)をロードするWPFアプリケーションがあります:

私の MetroContentControl は進行状況バーに囲まれているため、ユーザー コントロールが読み込まれている間に IsBusy 進行状況バーが読み込まれます。

private void ViewQuotes_OnClick(object sender, RoutedEventArgs e)
{
            RadBusyIndicator.IsBusy = true;
            Dispatcher.Invoke(new Action(() =>
            {
                // load datagrid control
                main.Content = new Quotes();
            }));
            //RadBusyIndicator.IsBusy = false;
}

ただし、ユーザーコントロール(グリッド)が読み込まれるまでプログレスバーが表示されないため、これがどのように機能するかについての私の仮定は間違っています。すでに初期化されたデータグリッドに非同期でデータをロードするときに、プログレスバーが期待どおりに機能していることは知っていますが、このインスタンスでは機能していないようですこれに対する最善のアプローチは何ですか?

4

1 に答える 1

0

簡単に言うと、ユーザー コントロールを別のスレッドでレンダリングするのは非常に困難です。

まず、進行状況バーのアニメーションも UI スレッドを占有することに注意する必要があります。つまり、時間のかかるジョブが UI スレッド上にある場合、進行状況バーが表示されていてもアニメーション化されません。そのため、ユーザー コントロールのロード時にプログレス バーを配置しても、期待どおりに動作しません。

次に、イベント ハンドラーに 2 つの UI 操作を配置すると、WPF は現在の操作が終了した後にのみこれらの UI 操作を処理できます。Dispatcher.Invoke を使用してユーザー コントロールの読み込みを呼び出し、デフォルトの優先度を Normal,9 (と思います) にし、直接呼び出し UI を Input,5 前後に設定しているため、ユーザー コントロールが読み込まれた後にプログレス バーが表示されます。

最後に、同期ジョブと非同期ジョブを明確に分離する必要があります。あなたの場合、すべてのUI関連は同期ジョブであり、見積もりの​​取得などのデータ関連の時間のかかるジョブがある場合は、それらを別のスレッドに配置して、ジョブの実行時に進行状況バーを表示し、ジョブが終了した後にユーザーコントロールをロードできます。

于 2013-07-26T15:18:12.920 に答える