2012-02-10 32 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"; 

さらに:あなたはUIスレッド上で実行され、同じ機能のボタンのプロパティを複数回変更する場合は、すべての変更は表示されませんこれは、メソッドが実行された後にUIスレッドがUIを更新するため、更新が速すぎるためです。

変更を表示するには、背景作業者を使用し、ProgressChangedハンドラでUIを更新します。

0

これは、すべて同じスレッド上で実行しているためです。したがって、コントロールはWPFに戻って状態を更新できないためです。作業を複数のスレッドに分割するか(BackgroundWorkerコンポーネントを参照)、別のメッセージを使用してボタンステータスを設定する必要があります(Dispatcherクラスを参照)。最終的には