Состояние кнопки не обновляется - PullRequest
0 голосов
/ 10 февраля 2012

У меня небольшое приложение WPF. Это приложение имеет кнопку, которая при нажатии должна изменить текст и быть отключена. Код для моего обработчика событий кнопки следующий:

/// <summary>
/// 'Read' button clicked
/// </summary>
/// <param name="sender"></param>
/// <param name="routedEventArgs"></param>
private void ReadVersionNumber(object sender, RoutedEventArgs routedEventArgs)
{
  Read.Content = "Reading....";
  Read.IsEnabled = false;

  SerialPort p = new SerialPort();
  string response = "Could not read version";

  try
  {
    // Do some stuff
  }
  catch (Exception)
  {
    response = "There was an error while reading the version number";
  }
  finally
  {
    Read.IsEnabled = true;
    Read.Content = "Read";

    if(p.IsOpen)
    {
      p.Close();
    }
  }

  Version.Text = response;
}

Проблема в том, что текст моей кнопки никогда не изменяется и не отключается. Я пытался вызвать UpdateLayout после установки свойств кнопки, но он все еще не меняется. Кнопка блокируется во время выполнения метода, а затем обновляет свой макет только в конце метода. Что мне нужно сделать, чтобы обновить макет?

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

В finally (которое ВСЕГДА выполняется) вы устанавливаете:

Read.IsEnabled = true;
Read.Content = "Read";

Далее: если вы измените свойство кнопки несколько раз в одной и той же функции, которая выполняется в потоке пользовательского интерфейса, вы не увидите никаких изменений, потому что обновления будут слишком быстрыми, поскольку поток пользовательского интерфейса обновляет пользовательский интерфейс ПОСЛЕ выполнения метода .

Если вы хотите увидеть изменения, вы можете использовать фонового работника и в обработчике ProgressChanged обновить пользовательский интерфейс.

0 голосов
/ 10 февраля 2012

Это потому, что вы делаете все это в одном потоке, поэтому контроль никогда не возвращается в WPF, чтобы он мог обновлять состояние. Вам нужно либо разбить вашу работу на несколько потоков (см. BackgroundWorker компонент), либо установить статус кнопки, используя отдельные сообщения (см. Dispatcher класс).

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