Странное поведение кода в WPF (проблема рендеринга) - PullRequest
1 голос
/ 19 января 2010

В приложении 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 Ответ

1 голос
/ 19 января 2010

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

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

...