2012-02-10 3 views
0

У меня есть небольшое приложение 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; 
} 

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

ответ

1

В конце концов (который всегда выполняет) вы установили:

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

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

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

0

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

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