从背景工人中修改控制.不存在



我在窗口内做了一个背景工人,而且效果很好。该代码开始持续很长时间,因此我决定创建一个工人课,并将所有逻辑放入其中。但是,当我这样做时,我将不再能够修改进度标准的价值。

我获得了"在当前上下文中不存在"。我想知道这是否与这是在单独线程上的事实有关?我也研究了这一点,但没有找到解释或解决方案。

我在XAML公开的进度栏上做了我的进度栏。

这是我的主要窗口代码。这里没有问题。

using System;
using System.Collections.Generic;
using System.Windows;
using Microsoft.Win32;
using Market.BI.Workers;
namespace Market
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            File_Worker my_worker = new File_Worker();
        }
    }
}

这是我班级的代码。这是我无法访问进度栏控件的地方。

using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
namespace Market.BI.Workers
{
    class File_Worker
    {
        private BackgroundWorker worker = new BackgroundWorker();
        void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {   
            Stuff
        }
        void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            Stuff
        }
        void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Stuff
        }
        //Method
        public File_Worker()
        {
            worker.DoWork               += new DoWorkEventHandler(Worker_DoWork);
            worker.ProgressChanged      += new ProgressChangedEventHandler(Worker_ProgressChanged);
            worker.RunWorkerCompleted   += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
            worker.WorkerReportsProgress = true;
            worker.RunWorkerAsync();
            fileProgressBar.IsIndeterminate = false;
        }
    }
}

问题是进度栏存在于您的MainWindow中,但不存在于File_Worker中。

当所有工人的代码都在Mainwindow内部时,它可以很容易地访问进度栏。但是File_Worker不知道,从哪里获得进度栏。


最简单的解决方案是将所有所需的UI对象(例如,进度栏)传递到其构造函数中,将上述对象存储在现场中并在需要的地方访问它们。

<</p>

这将执行您想要的事情:

将您的MainWindow的引用发送到File_worker类

// in MainWindow
File_Worker my_worker = new File_Worker(this);
// in File_Worker Class
class File_Worker
{
    private MainWindow _mainWin;
    Public File_Worker(MainWindow senderClass) 
    {
        _mainWin = senderClass;
    }    

对worker_dowork进行这些更改,以查看进度

void Worker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker backGroundWorker = (BackgroundWorker)sender;
    for (int i = 0; i <= 100; i += 5)
    {
        Thread.Sleep(50);
        backgroundWorker.ReportProgress(i);
    }
}

对worker_progresschanged进行这些更改,以更新UI

void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{   
    _mainWin.progressBar.Value = e.ProgressPercentage;
}

最新更新