【问题标题】:How to get the progress value that running at backgroundworker wpf c# mvvm如何获取在backgroundworker wpf c# mvvm上运行的进度值
【发布时间】:2015-09-19 13:29:01
【问题描述】:

我正在使用 MVVM Prism 开发 wpf 应用程序。我有四个视图,MainWindow、ViewB、ViewC 和 ViewD,它们都附有各自的 ViewModel。我在应用程序启动时初始化了后台工作程序。请参阅以下后台工作人员类。

 public class BackGroundThread
    {
        public BackgroundWorker bgWrk;
        public bool stopStatus;
        public int GetPercent;

        public BackGroundThread()
        {
            bgWrk = new BackgroundWorker();

            bgWrk.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
            bgWrk.ProgressChanged += backgroundWorker_ProgressChanged;
            bgWrk.DoWork += bw_DoWork;
            bgWrk.WorkerReportsProgress = true;

        }

        public void backgroundWorker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) { 

        }

        public void backgroundWorker_ProgressChanged(object sender,ProgressChangedEventArgs e)
        {
            Overall.EverythingOk = e.ProgressPercentage.ToString();

        }

        public void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            int i = 1;


            while (!stopStatus)
            {

                GetPercent = I;

                if (i == int.MaxValue)
                    i = 0;
                    i = i + 1;
            }
        }
    }

我从 MainWindow.xaml.cs 调用它并启动后台工作程序。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();            
        ViewModel.MainWindowsViewModel viewModel = new ViewModel.MainWindowsViewModel();
        this.DataContext = viewModel;
        BackGroundThread bgT = new BackGroundThread();
        bgT.bgWrk.RunWorkerAsync();
    }  
}

如何从视图的其余部分调用 GetPercent 变量?例如,当我导航到 ViewC 时,ViewC 使用 Label 或 TextBlock 显示实时值(​​值不断增加。)。然后我转到 ViewB,ViewB 还显示 GetPercent 变量的实时增量。

任何帮助,非常感谢。

谢谢

【问题讨论】:

  • 你想在其他视图中显示进度条的更新值吗?
  • 是的,不是进度条,只是百分比值。实际上我想在 WPF ListView 中显示。我将返回 PrimaryKeyValue 和 Percentage 值。目前不知道该怎么做。 :(

标签: c# wpf mvvm prism


【解决方案1】:

这是使用事件和委托的最佳方案。在您的 BackGroundThread 创建一个 EventHandler 并在其他类中监听该事件。

 public class ProgressBarEventArgs:EventArgs 
 {
        public int CompletedPercent{get;set;}
 }

public class BackgroundThread
{
    public static event EventHandler<ProgressBarEventArgs> CompletedEventHandler;

    public void backgroundWorker_ProgressChanged(object sender,ProgressChangedEventArgs e)
    {
        Overall.EverythingOk = e.ProgressPercentage.ToString();
        if (CompletedEventHandler != null)
        {
            CompletedEventHandler(sender, new ProgressBarEventArgs { CompletedPercent = e.ProgressPercentage });

        }

    }

}

您可以在其他视图的视图模型中访问此值

    class AnotherviewModel
    {
        BackgroundThread.CompletedEventHandler+=w_ChangedEventHandler;
        void w_ChangedEventHandler(object sender, ProgressBarEventArgs e)
        {
          // get e.Percentage
        }
    }

同样,您可以在任意多个课程中执行此操作。

【讨论】:

  • 嗨,感谢您的宝贵时间,但我根据您的指导进行创作。但百分比值完全为空。这是我的测试链接:onedrive.live.com/…
  • 你的进度条在运行吗??它是否报告了backgroundWorker_ProgressChanged 中的任何值?
  • 我在标签中显示百分比而不是在我的一个视图中显示进度条。我只想要我在 bw_DoWork 函数中创建的百分比值。它被称为 GetPercent 变量。
  • 在您的视图模型中访问事件处理程序,并在您的事件处理程序代码中将值绑定到标签。
  • void w_ChangedEventHandler(object sender, ProgressBarEventArgs e) { UpdatePercentage = e.CompletedPercent.ToString(); } 公共 TestViewModel(tblTransaction 模型) { BackGroundThread.CompletedEventHandler += w_ChangedEventHandler; }
【解决方案2】:

直接来自 MSDN 上的 BackgroudWorker 主页面
你需要调用worker.ReportProgress(...);

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    for (int i = 1; i <= 10; i++)
    {
        if (worker.CancellationPending == true)
        {
            e.Cancel = true;
            break;
        }
        else
        {
            // Perform a time consuming operation and report progress.
            System.Threading.Thread.Sleep(500);
            worker.ReportProgress(i * 10);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多