Анимация загрузки в 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
}

person B.S.    schedule 11.12.2011    source источник


Ответы (1)


Событие 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
}
person Paul Wheeler    schedule 11.12.2011