1

ページの読み込みに時間がかかるときに読み込みアニメーションを表示しようとしています。スレッドを使用したユーザーの要求に応じて、複数/複数のユーザー コントロールを読み込んでいます。私は次の方法を試しました

  1. this.Dispatcher.BeginInvoke(new Action(LoadSecondPageData), DispatcherPriority.Background); これを使用していると、ページが読み込まれるまで読み込みアニメーションがフリーズします

  2. 私もBackgroundWorker概念を試しましたアニメーションの読み込みはここで機能していますが、ユーザーコントロールの読み込みが許可されておらず、エラーが発生しています。

エラー: 「多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。」

4

2 に答える 2

0

を使用してメイン UI スレッドでアニメーションを開始する必要がありますがDispatcher.BeginInvoke、アニメーションがフリーズしないように、データの読み込みはバックグラウンド スレッドで行う必要があります。Dispatcher.BeginInvokeデータが読み込まれると、依存関係プロパティに影響を与える最終的な更新は、もう一度使用して UI スレッドにマーシャリングする必要があります。

于 2013-04-22T15:30:19.237 に答える
0

私もBackgroundWorkerのコンセプトを試してみましたアニメーションの読み込みはここで機能していますが、ユーザーコントロールの読み込みが許可されておらず、エラーが発生しています。

これは仕様によるもので、STA ではないため、バックグラウンド スレッドで UI 側に触れることはできません。代わりに、進行状況インジケーターをスレッドが変更できるプロパティにバインドすると、進行状況インジケーターは INotifyPropertyChanged イベントを介して更新を取得します。

たとえば、 にProgressBarバインドされている場合ProgressPercentage、または不確定なビジー インジケータが にバインドされている場合IsBusy:

XAML

<ProgressBar x:Name="StatusBar"
             Maximum="1" Value="{Binding ProgressPercentage}" />

Code

using (var backgroundWorker = new BackgroundWorker())
{
    backgroundWorker.DoWork += (s, ex) =>
    {
        IsBusy = true;
        StatusText = "Pretending to do something...";

        for (int i = 0; i < 100; i++)
        {
            ProgressPercentage = (i + 1)/100.0D;
            Thread.Sleep(100);
        }
    };

    backgroundWorker.RunWorkerCompleted += (s, ex) =>
    {
        IsBusy = false;
        StatusText = "Export Complete.";
    };

    backgroundWorker.RunWorkerAsync();
}

バックグラウンド スレッドが作業を行い、待機中に UI スレッドがブロックされることはなく、進行状況インジケーターが更新されます。

于 2013-04-22T16:00:43.757 に答える