2011-07-16 6 views
3

は、私は、Extended WPF ToolkitのBusyIndi​​catorBusyIndi​​catorを強制するには?

私のXAML使用

<extToolkit:BusyIndicator Name="wait" IsBusy="False" Cursor="Wait" Grid.ColumnSpan="3" Margin="10,10,10,10"/> 

マイコード:

private void esp_Click(object sender, RoutedEventArgs e) 
{ 
    wait.IsBusy = true; 

    // My work here make some time to finish 

    wait.IsBusy = false; 
} 

しかし、それがあったことがないが、私は機能BusyIndi​​catorの最後にメッセージボックスを作ってみますメッセージボックスの後に表示されます。

試しました

wait.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, 
         (Action)delegate 
{ 
    wait.IsBusy = true; 
}); 

しかし、私は何も得られませんでした! どこに問題がありますか?解決できません。

私は同様の質問を見つけましたが、インジケータが表示されても機能が完了した後に同じ問題はありません。

答えて

7

問題は、ディスパッチャのスレッドですべての作業を実行していることです(私はesp_Clickがイベントハンドラであると仮定しています)。これは事実上、長いタスクを実行中にUIが更新されていないことを意味します。

別のスレッドで作業を行う必要があります。新しいスレッドを作成したり、スレッドプールを使用したり、タスクを作成する必要があります。作業を完了した後にIsBusytrueに、falseに設定してください。別のスレッドからwait.IsBusyを更新する場合は、Dispatcher.BeginInvoke/Invokeを使用する必要があります。

サンプルコード:

private void LongRunningTask() 
{ 
    // your long running code 

    // after you complete: 
    Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, 
          (Action)delegate 
    { 
     wait.IsBusy = false; 
    }); 
} 

private void esp_Click(object sender, RoutedEventArgs e) 
{ 
    wait.IsBusy = true; // either here, or in your long running task - but then remember to use dispatcher 

    var thread = new Thread(LongRunningTask); 
    thread.Start(); 

    // OR 

    ThreadPool.QueueUserWorkItem(state => LongRunningState()); 

    // OR, in .NET 4.0 

    Task.Factory.StartNew(LongRunningTask); 
} 

(注)このソリューションのどちらが例外を処理すること - あなたは自分でエラー処理を追加(または最後のサンプルの場合には、タスク継続を使用)する必要があります。

+0

と私は本当のwait.IsBusy =を追加する必要があります。 !!私の長いコードの前に? – Akrem

+0

はい、申し訳ありません - 追加することを忘れました。私は私の答えを編集しました。 – maciejkow

+0

私は自分のコードでいくつかのテキストボックスを使用して、私はそのテキストボックスの例外を持って "別のスレッドはそれを所有している"! – Akrem

1

あなたはINotifyPropertyChangedでそれを行うことができます:

<extToolkit:BusyIndicator Name="wait" IsBusy="{Binding IsBusy}" Cursor="Wait" Grid.ColumnSpan="3" Margin="10,10,10,10"/> 

とC#を:

/// <summary> 
    /// The <see cref="IsBusy" /> property's name. 
    /// </summary> 
    public const string IsBusyPropertyName = "IsBusy"; 
    private bool _isBusy = false; 

    public bool IsBusy 
    { 
     get 
     { 
      return _isBusy; 
     } 

     set 
     { 
      if (_isBusy != value) 
      { 
       _isBusy = value; 
       RaisePropertyChanged(IsBusyPropertyName);     
      } 
     } 
    } 
+0

真面目なことを指摘してくれてありがとう。真剣に(私はBusyIndi​​catorが現れていない理由を30分は疑問に思っていた。 – David

関連する問題