2016-12-22 31 views
0

我創建了一個用於將數據從一個數據庫導入和轉換爲另一個數據庫的小工具。由於這需要很長時間,我想用一個不確定的進度條爲用戶顯示某種進度。 只要導入正在運行,進度條也應該運行。 我用這個網站作爲參考:The ProgressBar control但是我很難理解DoWork-Method的作用,因爲一個不確定的進度條選項被設置一次。在WPF中使用不確定進度條和Backgroundworker

我想出了一個半途而廢的解決方案,導入完成後我無法停止動畫。 有人可以幫我嗎?

XAML:

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

視圖模型:

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

你的意思是* indeterminate *而不是* indeterminated *? –

+0

@JimMischel看起來他實際上確實不確定。它將提到一個進度指標,其中你實際上並不知道該操作需要多長時間,而只是表明進展確實正在進行。 – Servy

+0

這就是我的意思,它是顯示導入仍在運行的指示器。我也在我的問題中進行了編輯。感謝您指出。 – Scorch

回答

1

這裏是我的作品。 RelayCommand和ViewModelBase來自MvvmLight庫,DoWorkCommand被一個按鈕調用:

 <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