2011-12-11 3 views
0

내 창에 단추가 있습니다. 사용자 클릭 후 버튼을 내 응용 프로그램이 로딩 레이블에 애니메이션을 적용하고 (rotateg it으로), 다른 스레드가 데이터베이스에서 데이터를 가져오고 싶습니다. DB 애니메이션에서 데이터를로드 한 후을 종료해야합니다. 작업은 간단 해 보이지만 작동하지 않습니다. 문제는 애니메이션을 수행하는 모든 애니메이션은 필요하지 않을 때 데이터베이스에서로드 한 후에 만 ​​시작된다는 것입니다.WPF에서 애니메이트 로딩 C#

도움말. 여기에 몇 가지 코드 : Dispatcher.Completed 이벤트가 메인 UI 스레드에서 실행되는

private void LoginButtonClick(object sender, RoutedEventArgs e) 
{ 
    Thread thread = new Thread(new ThreadStart(
    delegate() 
    { 
     DispatcherOperation dispatcherOp = 
     this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
      delegate() 
      { 
      var da = new DoubleAnimation(360, 0, new Duration(TimeSpan.FromSeconds(1))); 
      var rt = new RotateTransform(); 
      loadingLabel.RenderTransform = rt; 
      loadingLabel.RenderTransformOrigin = new Point(0.5, 0.5); 
      da.RepeatBehavior = RepeatBehavior.Forever; 
      rt.BeginAnimation(RotateTransform.AngleProperty, da); 
      })); 
     dispatcherOp.Completed += new EventHandler(DispatcherOpCompleted); 
    })); 
    thread.Start(); 
} 

void DispatcherOpCompleted(object sender, EventArgs e) 
{ 
    //Loading From Database 
} 

답변

3

. 작업자 스레드는 디스패처 작업을 대기열에두고 종료합니다. 애니메이션을 시작한 스레드를 만들고 Completed 처리기에서 데이터베이스를로드하는 대신 주 스레드에서 애니메이션을 시작한 다음 데이터베이스로드를 수행 할 작업자 스레드를 만듭니다.

private void LoginButtonClick(object sender, RoutedEventArgs e) 
{ 
    var da = new DoubleAnimation(360, 0, new Duration(TimeSpan.FromSeconds(1))); 
    var rt = new RotateTransform(); 
    loadingLabel.RenderTransform = rt; 
    loadingLabel.RenderTransformOrigin = new Point(0.5, 0.5); 
    da.RepeatBehavior = RepeatBehavior.Forever; 
    rt.BeginAnimation(RotateTransform.AngleProperty, da); 

    Thread thread = new Thread(new ThreadStart(LoadData)); 
    thread.Start(); 
} 

void LoadData() 
{ 
    //Loading From Database 

    // Use a Dispatch.BeginInvoke here to stop the animation 
    // and do any other UI updates that use the results of the database load 
}