2016-12-22 8 views
0

1つのデータベースから別のデータベースにデータをインポートおよび変換するための小さなツールを作成しました。これには多くの時間がかかりますので、不確定のプログレスバーを使ってユーザーに何らかの進捗状況を表示したかったのです。 インポートが実行されている間は、プログレスバーも実行している必要があります。 私はこのサイトを参照のために使用しました:The ProgressBar controlしかし、不確定のプログレスバーのオプションは一度設定されているので、DoWork-Methodの役割を理解するのが難しくなりました。WPFでバックグラウンドワーカーとIndeterminateプログレスバーを使用

インポートが完了した後でアニメーションを途中で止めることはできません。 誰かが私を助けてくれますか?

XAML:

<ProgressBar Minimum="{Binding Path=Minimum}" Maximum="100" IsIndeterminate="{Binding Path=IsIndeterminate}" Height="20" Grid.Column="2" Grid.Row="5" Grid.ColumnSpan="2"/> 

のViewModel:ここ

public void StartImportThread() 
    { 
     ButtonsEnabled = false; 
     var th = new Thread(new ThreadStart(StartImport)); 
     th.IsBackground = true; 
     th.Start(); 
    } 
public void StartImport() 
    { 
     _threadDispatcher = Dispatcher.CurrentDispatcher; 
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 
     worker.WorkerSupportsCancellation = true; 
     worker.DoWork += worker_DoWork; 
     worker.RunWorkerCompleted += worker_Complete; 

     worker.RunWorkerAsync(); 

     // Doing Import Stuff 
     worker.CancelAsync(); // Import finished 
     ButtonsEnabled=true; 
    } 
    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     // while(true) 
    // { 
      Minimum = 0; 
      IsIndeterminate = true; 
    // } 


    } 


    private void worker_Complete(object sender, RunWorkerCompletedEventArgs e) 
    { 
     // if (e.Cancelled) 
     // { 
      IsIndeterminate = false; 
      Minimum = 100; 
     // } 

    } 
+1

*不定*意味ではなく、*のですか? –

+0

@JimMischel彼は実際に私が不確定であるように見えます。これは、実際にどれくらいの時間がかかるかを実際には把握しておらず、単に進捗が実際に行われていることを示す進捗インジケータを指します。 – Servy

+0

これは私が言ったことです、それはインポートがまだ実行中であることを表示するための指標です。私も私の質問に編集を加えました。それを指摘してくれてありがとう。 – Scorch

答えて

1

が私のためにどのような作品です。 RelayCommandとViewModelBaseはMvvmLightライブラリーから、DoWorkCommandはボタンによって呼び出されている:あなたは* indeterminated

 <Button Name="BtnReload" Command="{Binding DoWorkCommand}" Width="75" Height="25"/> 
     <ProgressBar Minimum="{Binding Path=Minimum}" Maximum="100" IsIndeterminate="{Binding Path=IsIndeterminate}" Height="20"/> 



    public class MainViewModel : ViewModelBase { 

    private RelayCommand _doWorkCommand; 
    private bool _isIndeterminate; 
    private int _minimum; 
    private Dispatcher _threadDispatcher; 


    public int Minimum { 
     get { return _minimum; } 
     set { 
      _minimum = value; 
      RaisePropertyChanged(nameof(Minimum)); 
     } 
    } 

    public bool IsIndeterminate { 
     get { return _isIndeterminate; } 
     set { 
      _isIndeterminate = value; 
      RaisePropertyChanged(nameof(IsIndeterminate)); 
     } 
    } 

    public MainViewModel(IDataService dataService) { 

    } 

    public void StartImportThread() { 
     // ButtonsEnabled = false; 
     var th = new Thread(new ThreadStart(StartImport)); 
     th.IsBackground = true; 
     th.Start(); 
    } 

    public void StartImport() { 
     _threadDispatcher = Dispatcher.CurrentDispatcher; 
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 
     worker.WorkerSupportsCancellation = true; 
     worker.DoWork += worker_DoWork; 
     worker.RunWorkerCompleted += worker_Complete; 

     worker.RunWorkerAsync(); 

     // Doing Import Stuff 
     worker.CancelAsync(); // Import finished 
     // ButtonsEnabled = true; 

    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) { 
     Minimum = 0; 
     IsIndeterminate = true; 
     //for (int i = 0; i < 30; i++) { 
     // Thread.Sleep(100); 
     //}  
    } 

    void worker_Complete(object sender, RunWorkerCompletedEventArgs e) { 
     IsIndeterminate = false; 
     Minimum = 100; 
    } 

    public RelayCommand DoWorkCommand => _doWorkCommand ?? 
     (_doWorkCommand = new RelayCommand(() => StartImportThread())); 

} 
+0

あなたのソリューションと私のアプローチの間に違いは見られません。私がデバッグしている間、私はworker_DoWork()とworker_Complete()のメソッドが連続して実行されていることに気付きました。 worker_Complete()はCancelAsync()を待つことなくすぐに実行されます。これは、worker_Complete()メソッドがそうでないと言っていますが、プログレスバーがまだ不確定なので、少し刺激的です。 – Scorch

関連する問題