2016-07-06 2 views
1

MVVM C#プロジェクトには、処理を行うフォーム上にボタンがあります。 処理には数秒かかり、それでも問題ありません。処理中に背景色を変更したい関連するテキストボックスがあります。私はこれを成功させることを試みてきました。メソッド内のTextBoxの色を変更する

私はボタンで呼び出されたメソッドの始めに(コマンドバインディングを介して)変更するプロパティにバインドされたテキストボックスの背景色を持っています。このメソッドは、作業を行い、背景色をデフォルトの色に戻します。ボタンをクリックすると、画面に変更はありません。

ディスパッチャーの中にカラー変更コードを入れてGUIスレッド上で実行しようとしましたが、これはまだ動作しません。

私は今混乱しています。色を正しく変更するにはどうすればよいですか?私は何が起こっていると信じて何

private void SwitchRuns() 
    { 
     try 
     { 

      // Bound property (set up with Notification correctly) 
      // 
      CurRunTextBoxColor = Colors.Red; 

      UIServices.SetBusyState(true); // sets cursor to wait 

      ... 
      Processing code 
      ... 

      CurRunTextBoxColor = Colors.LightGreen; 

     } 
     catch (Exception exp) 
     { 
      log.Error("Exception in SwitchRuns" + exp); 
     } 
    } 
+0

何があなたのTextBoxの背景のためのような結合見て? – Bijington

+1

コード処理中にGui-Threadをブロックしていますか? – lokusking

答えて

0

はメソッドはUIスレッドから直接呼び出されたあなたのSwitchRunsであるため、UIスレッドがビジー状態です。バックグラウンドスレッドに操作を押すと、問題を解決する必要があります。

private void SwitchRuns() 
{ 
    ThreadPool.QueueUserWorkItem((o) => this.SwitchRuns()); 
} 

private void SwitchRunsAsync() 
{ 
    // Bound property (set up with Notification correctly) 
    // 
    this.Dispatcher.BeginInvoke((Action)(() => 
    { 
     CurRunTextBoxColor = Brushes.Red; 
    }), DispatcherPriority.Send); 

    // Place your load logic here in place of the sleep. 
    Thread.Sleep(2000); 

    this.Dispatcher.BeginInvoke((Action)(() => 
    { 
     CurRunTextBoxColor = Brushes.LightGreen; 
    }), DispatcherPriority.Send); 
} 

は私がのBackground財産への結合を得るためにBrushなくColorであるためにあなたのCurRunTextBoxColor財産をも変更されていることに注意してくださいTextBoxが動作します。代わりにCurRunTextBoxColor = Colors.Red;

書き込みの

0

this.Dispatcher.Invoke(() => { myTextBox.Background = Brushes.Red });

+0

OPはMVVMアプリケーションであることを示しました。 – Bijington

関連する問題