UI で負荷の高いタスクが発生しているときにビジー インジケーターを表示することはできますか? 私たちのアプリでは、長時間実行されるタスクの大部分がコントロールのレンダリングであり、このコントロールのレンダリング中にインジケーターを表示する必要があります。
3 に答える
UI スレッドがビジー状態のときに読み込みアニメーションを表示することはできませんが、TextBlock
適切なテキストを含むコントロールのような静的通知を表示することはできます。ただし、コントロールのテキストを更新した直後に UI スレッドで実行時間の長い操作を開始すると、TextBlock
コントロールの UI は操作が終了するまで更新されません。この問題を解決するには、Silverlight UI スレッドをフリーズする前にテキスト インジケーターを表示する という質問の回答で説明されている手法を使用できます。
まず、バックグラウンド スレッドを使用して長時間実行される作業を行うことを検討してください。これが不可能な場合、つまり、UI スレッドで UI コンポーネントをロードするのに本当に時間がかかる場合は、ビジー インジケータをオーバーレイとしてロード部分の上に配置し、すべてがロードされたときにオーバーレイを非表示にすることができます。
ところで、UI ロジックを UI から分離せずにレスポンシブなマルチスレッド アプリを作成するのは困難です。「MVVM」パターンを調査します。MVVM を使用すると、アプリが飛躍的に向上します。
「コード ビハインド」を使用する本格的なアプリはないと思います。つまり、すべてが DataContext、データ バインディング、ViewModel、および Commands を介して行われます。
それ以外の場合は、Tasks または BackgroundWorker の使用を検討し、Dispatcher を理解してください。
ルーク
DispatcherTimer を使用して、負荷の高いタスクが呼び出される前に (遅延を使用して) 実行中のインジケーターを設定してみてください。
その後、重いタスクが完了したら、インジケーターを無効にすることができます。
私のために働きます。
'enable busy indicator & set up the timer'
Private Sub renderControl(ByVal sender As Object, ByVal e As RoutedEventArgs)
_busyIndicator.IsBusy = True
Dim timer As New DispatcherTimer
timer.Interval = TimeSpan.FromMilliseconds(100)
AddHandler timer.Tick, AddressOf renderControl_TimerTick
timer.Start()
End Sub
'do your heavy task, disable busy indicator then stop the timer'
Private Sub renderControl_TimerTick(ByVal sender As Object, ByVal e As EventArgs)
DoStuff()
_busyIndicator.IsBusy = False
'Stop the timer'
TryCast(sender, DispatcherTimer).[Stop]()
End Sub
お役に立てれば!