Анимация загрузки в WPF C # - PullRequest
       30

Анимация загрузки в WPF C #

0 голосов
/ 11 декабря 2011

У меня есть кнопка в моем окне.После того, как пользователь нажмет кнопку, я хочу, чтобы мое приложение анимировало загрузочную метку (с вращением), в то время как другой поток получает некоторые данные из базы данных . После загрузки данных из БД анимация должна завершиться .Задача кажется простой, но она не работает.Проблема в том, что анимация, что бы я ни делал, анимация запускается только после загрузки из базы данных, когда она не нужна.

Помогите, пожалуйста.Вот некоторый код:

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
}

1 Ответ

3 голосов
/ 12 декабря 2011

Событие 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
}
...