Обновление пользовательского интерфейса в обработчиках событий элементов WPF - PullRequest
7 голосов
/ 14 июня 2011

Существует проблема с обновлением пользовательского интерфейса в WPF.

У меня есть такой код:

    private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
    {
        Label.Visibility = Visibility.Visible;
        TextBox.Text = "Processing...";

        LongTimeMethod(); //some long operation
    }

Проблема в том, что до тех пор, пока LongTimeMethod не завершится (то есть обработчик событий завершится), Label.Visibility и TextBox.Text не будут изменены.

Пока я решил это так:

    private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
    {
        Label.Visibility = Visibility.Visible;
        TextBox.Text = "Processing...";

        Dispatcher.BeginInvoke(new Action(LongTimeMethod), 
            DispatcherPriority.Background);
    }

Есть ли какое-либо другое решение без использования диспетчера?Вызов this.UpdateLayout () не помогает.

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

С Dispatcher.BeginInvoke вы все еще используете поток пользовательского интерфейса для LongTimeMethod(). Если это не требуется (то есть выполняется некоторая фоновая обработка), я бы предложил использовать TPL для запуска его в фоновом потоке:

private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
{
    Label.Visibility = Visibility.Visible;
    TextBox.Text = "Processing...";

    Task.Factory.StartNew(() => LongTimeMethod())
        .ContinueWith(t =>
        {
            Dispatcher.BeginInvoke((Action)delegate()
            {
                TextBox.Text = "Done!";
            });
        });

}

При использовании этого метода длительный метод обрабатывается в фоновом потоке (поэтому поток пользовательского интерфейса будет свободен для продолжения рендеринга, а приложение не будет зависать), и вы можете делать все, что изменяет пользовательский интерфейс (например, обновление текста в текстовом поле) в пользовательском интерфейсе Dispatcher после завершения фоновой задачи

1 голос
/ 14 июня 2011

Видимость и Текст - это свойства зависимостей, которые обновляются диспетчером. Ваше решение абсолютно правильное, но я предлагаю сделать это асинхронно.

С другой стороны, вы можете имитировать Application.DoEvents в WPF ( см. Статью ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...