2011-12-11 68 views
0

我有我的窗口上的按钮。用户点击按钮我想要我的应用程序动画加载标签(与rotationg它),在其他线程从数据库获取一些数据。 从DB动画加载数据后,必须结束。该任务看起来很简单,但它不起作用。 问题是,无论我做动画动画,只有在不需要时从数据库加载后才会启动。动画加载WPF C#

请帮忙。这里是一些代码:

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

在主UI线程上执行的Dispatcher.Completed事件。您的工作线程只是对调度程序操作进行排队并退出。除了创建一个启动动画的线程,然后在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 
}