2013-04-22 6 views
1

Я пытаюсь показать анимацию загрузки, когда на страницу требуется время для загрузки. Я загружаю несколько/несколько пользовательских элементов управления в зависимости от запроса пользователя с помощью Thread. Я попробовал следующие способыshow Загрузка анимации в wpf

  1. this.Dispatcher.BeginInvoke(new Action(LoadSecondPageData), DispatcherPriority.Background); , когда я использую это он делает мою Загрузку анимации замораживания до загрузки страницы

  2. Я также пытался BackgroundWorker понятия Загрузка анимации здесь работает, но это не позволяя загружать usercontrols и давать ошибку.

Ошибка: «Вызывающий поток должен быть STA, потому что для этого требуется множество компонентов пользовательского интерфейса».

+0

Вы используете инъекцию зависимости? используете ли вы для загрузки бизнес-данных при запуске или сбоях? –

+0

Да Я загружаю данные при запуске, но я не использую никакой инъекции зависимостей. Я извлекаю данные из внешнего файла и создаю пользовательские элементы управления на основе этих данных при загрузке страницы. – nandu

+0

Что находится внутри LoadSecondPageData? можете ли вы опубликовать код? – Dilshod

ответ

0

Вам необходимо запустить анимацию на основном потоке пользовательского интерфейса, используя Dispatcher.BeginInvoke, но любая загрузка данных должна происходить в фоновом потоке, чтобы анимация не зависала. Когда данные загружаются, все финальные обновления, которые влияют на свойства зависимостей, должны быть перенаправлены на поток пользовательского интерфейса, используя Dispatcher.BeginInvoke еще раз.

0

I also tried BackgroundWorker concept Loading animation is working here, but it is not allowing to load the usercontrols and giving an error.

Это дизайн, вы не разрешается трогать ничего на стороне пользовательского интерфейса в вашем фоновом потоке, так как это не будет STA. Вместо этого привяжите индикатор прогресса к свойствам, которые поток может изменить, а затем индикатор прогресса получит обновление через событие INotifyPropertyChanged.

Например, если вы имели ProgressBar обязан ProgressPercentage или неопределенную занят индикатор, связанный с IsBusy:

В XAML:

<ProgressBar x:Name="StatusBar" 
      Maximum="1" Value="{Binding ProgressPercentage}" /> 

В Code:

using (var backgroundWorker = new BackgroundWorker()) 
{ 
    backgroundWorker.DoWork += (s, ex) => 
    { 
     IsBusy = true; 
     StatusText = "Pretending to do something..."; 

     for (int i = 0; i < 100; i++) 
     { 
      ProgressPercentage = (i + 1)/100.0D; 
      Thread.Sleep(100); 
     } 
    }; 

    backgroundWorker.RunWorkerCompleted += (s, ex) => 
    { 
     IsBusy = false; 
     StatusText = "Export Complete."; 
    }; 

    backgroundWorker.RunWorkerAsync(); 
} 

фоновый поток выполнит свою работу, поток пользовательского интерфейса не будет блокироваться во время ожидания, а ваш прогресс будет icator будет обновляться по мере его появления.

Смежные вопросы