繁体   English   中英

在WPF中将不确定的进度栏与Backgroundworker一起使用

[英]Using Indeterminate Progressbar with Backgroundworker in WPF

我创建了一个小工具,用于将数据从一个数据库导入和转换到另一个数据库。 由于这需要花费很多时间,因此我想用不确定的进度条为用户显示某种进度。 只要导入在运行,进度条也应该在运行。 我使用此站点作为参考: ProgressBar控件,但是由于不确定进度条的选项设置一次,所以我无法理解DoWork-Method的作用。

我想出了一个半途而废的解决方案,导入完成后我无法停止动画。 有人可以帮我吗?

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;  
       // }

    }

这是对我有用的。 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()));

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM