2012-04-19 2 views
1

UI에서 과중한 작업이 발생하면 Busy Indicator를 표시 할 수 있습니까? 우리 앱에서 장기 실행 태스크의 대부분은 컨트롤을 렌더링하는 것이므로 컨트롤이 렌더링되는 동안 표시기를 표시해야합니다.Silverlight - 사용중인 UI 스레드에 BusyIndicator 표시

+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 및 명령을 통해 수행됩니다.

그렇지 않으면 Tasks 또는 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 

희망이 있습니다.

관련 문제