2010-01-19 2 views
1

I приложения WPF У меня есть следующие события-обработчик кнопки щелкните в файл кода окна:Странное поведение кода в WPF (рендеринга выпуск)

private void AddNewRecBtn_Click(object sender, RoutedEventArgs e) 
    { 
      DimRec.Visibility = System.Windows.Visibility.Visible; 
      PrBarLayer.Visibility = System.Windows.Visibility.Visible; 
      try 
      { 
       WriteAndClose(); 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
    } 

Эти строки кода :

 DimRec.Visibility = System.Windows.Visibility.Visible; 
     PrBarLayer.Visibility = System.Windows.Visibility.Visible;  

просто сделать видимый прямоугольник DimRec с Opacity="0.5" Fill="Gray" затемнения окна во время просмотра ProgressBar и StackPanel PrBarLayer с самим ProgressBar. WriteAndClose(); метод выполняет много вещей, включая запрос LINQ to SQL и большую визуализацию на экране, что занимает несколько секунд (пока происходит, на экране ничего не происходит, все кажется замороженным).

В течение этого периода в несколько секунд я хотел бы показать пользователю омраченное управление окном и индикатор выполнения, но проблема в том, что эти слои, которые делают код видимым, на самом деле не отображаются. Если я удалю WriteAndClose(); метод из этого обработчика, все в порядке - становится видимым ProgressBar.

Похоже, что WPF не визуализирует визуальные элементы управления одновременно, а затем ресурсы переходят к следующему методу WriteAndClose, все зависает, а затем экран получается рендером, когда все уже сделано, а видимость слоя индикатора выполнения выполнена скомпенсирована.

Что может быть решением? Как я мог сделать шоу ProgressBar первым, и только тогда останутся тяжелые вещи?

ответ

1

Вам придется переместить выполнение WriteAndClose в другой поток.

Однако, вы сможете управлять пользовательским интерфейсом только с помощью [Control.] Dispatcher.BeginInvoke.