2011-12-22 6 views
1

私のアプリケーションでは、カスタムステータスバーコントロールを実現しました。それはprogressbar、statusTextBoxなどを持っています。他のモジュールは、MEFを使ってそのクラスのインスタンスを取得し、メソッドやプロパティで要素のデータをバインドできます。問題は、いくつかの操作が完了した後にのみ、自分のステータスバーのビューが更新されることです。ここ はコードの例です:DispatcherまたはBackroundWorkerをWPFのカスタムStatusBarコントロールで使用する方法

[ImportingConstructor] 
public IconManagerModel(IStatusBar statusBar) 
{ 
    StatusBar = statusBar; 
} 

public void SomeMethod() 
{  
    for(...) 
    { 
     //I tried to use Dispatcher but it didn't help. View updates after method has finished 
     Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, 
      delegate() 
      { 
       StatusBar.SetProgress(amountComleted,total) 
      } 
     ); 

     // ... 
    } 
} 

ありがとう

答えて

1

あなたは進行状況を更新するDispatcherにコールバックし、その後、別のスレッド上でSomeMethod()を実行したいです。実際に、カスタムプログレスバーがいくつかのUI要素に接続されている場合、実装はUIスレッドへのコールバックを処理する必要があります。

あなたは少し何かしたいことがあります。

public IconManagerModel(IStatusBar statusBar) 
{ 
    StatusBar = statusBar; 

    var thread = new Thread(new ThreadStart(SomeMethod)); 
    thread.Start(); 
} 

SomeMethod()は今、別のスレッドで実行されますが、あなたがUIスレッドに進捗状況を更新した場合、あなたはあなたが望む結果が表示されるはずです。

0

上記の回答にsladeを追加するには、メッセージポンプがメッセージを直ちに処理するようにする場合は、DispatcherPriority.Renderを使用することをおすすめします。 Invoke(同期)とBeginInvoke(非同期)で再生します。前者は更新をすぐに強制しますが、処理作業はブロックされます。後者は、メッセージポンプがフリーで一般的に推奨されている場合に更新されます。

いずれの方法でも、バックグラウンドの作業がバックグラウンドスレッド上にある必要があります。特に、時間がかかっている場合や、UIの期間がブロックされている場合は特にそうです。

関連する問題