2012-04-19 13 views
1

UIで重いタスクが発生しているときにビジー状態を表示することはできますか?私たちのアプリでは、長時間実行されるタスクの大部分はレンダリングコントロールであり、このコントロールがレンダリングされている間にインジケータを表示する必要があります。Silverlight - ビジー状態のUIスレッドにBusyIndi​​catorを表示

+0

これを確認してくださいhttp://forums.silverlight.net/post/556179.aspx –

+0

ありがとうございました。 – arcbound08

答えて

0

UIスレッドがビジー状態のときに読み込みアニメーションを表示することはできませんが、TextBlockコントロールのような静的な通知を適切なテキストで表示できます。しかし、TextBlockコントロールのテキストを更新した直後にUIスレッドで長時間実行される操作を開始すると、操作のUIが更新されて操作が終了するまで更新されません。この問題を解決するには、次の質問の回答に記載されている方法を使用します。Showing a text indicator before freezing the Silverlight UI thread

0

まず、バックグラウンドスレッドを使用して、長時間実行する作業を行います。これが不可能な場合、UIスレッドにUIコンポーネントを読み込むまでの時間が本当にかかる場合は、読み込み中の部品の上にビジーインジケータをオーバーレイとして配置し、すべてが読み込まれたときにオーバーレイを非表示にすることができます。

ところで、UIロジックをUIから分離することなく、レスポンスの高いマルチスレッドアプリケーションを作成するのは難しいです。 MVVMのパターンを研究してください。 MVVMを使用すると、あなたのアプリケーションは飛躍的に発展します。

重大なアプリケーションでは「コードビハインド」は使用されていない、つまりすべてがDataContext、データバインディング、ViewModels、およびコマンドによって行われているとします。

それ以外の場合は、タスクまたはBackgroundWorkerを使用してDispatcherを理解してください。

ルーク

0

重いタスクが(遅延を使用して)呼び出される前に、実行中のビジーインジケータを設定するには、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 

関連する問題