从后台工作人员修改控件。不存在

时间:2019-02-14 12:31:11

标签: c# .net xaml

我已经在窗口中创建了背景工,效果很好。代码开始变得冗长,因此我决定创建一个worker类,并将所有逻辑放在那里。但是,执行此操作后,我将无法再修改进度条的值。

我得到一个“在当前上下文中不存在”。我想知道这是否与一个单独的线程有关吗?我也进行了研究,但没有找到解释或解决方案。

我在XAML上公开了进度条,但这没什么区别。

这是我的主窗口代码。我在这里看不到任何问题。

execFile

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

const {execFile} = require("child_process");

let i = 0
function runRedirector(){
    execFile("./redirector.out", ["1"], {}, function(error, stdout, stderr) {
      console.log('In callback', i++)
      runRedirector();
    });
    console.log('In runDirector', i);  // this will be logged first
}

2 个答案:

答案 0 :(得分:1)

问题在于进度条存在于您的MainWindow中,而不存在于File_Worker中。

当所有工作人员的代码都位于MainWindow内部时,它可以轻松访问进度条。但是File_Worker不知道从何处获取进度条。


最简单的解决方案是将所有需要的UI对象(例如进度条)传递给其构造函数中的worker类,将所述对象存储在字段中,并在需要时访问它们。

答案 1 :(得分:0)

这将满足您的要求:

将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进行这些更改,以更新用户界面

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