【问题标题】:Modify Control from Background Worker. Does not exist从后台工作人员修改控制。不存在
【发布时间】:2019-02-14 12:31:11
【问题描述】:

我在我的窗口中创建了一个后台工作程序,它工作得很好。代码开始变长,所以我决定创建一个工作类并将我所有的逻辑都放在那里。但是,当我这样做时,我不再能够修改进度条的值。

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

我在 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;
        }
    }
}

【问题讨论】:

  • 错误出现在哪一行?
  • 还有:堆栈跟踪如何,完整异常如何? (x.ToString())。
  • @keim - 这是最后一行。 fileProgressBar.IsIndeterminate = false;

标签: c# .net xaml


【解决方案1】:

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

当所有工作人员的代码都在主窗口中时,它可以轻松访问进度条。但是File_Worker 不知道从哪里获取进度条。


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

【讨论】:

  • 我之前试过了。 public File_Worker(object fileProgressBar) 问题是该对象没有属性。还是使用了错误的对象类型?
  • @Pirate:为什么是object 而不是ProgressBar?
  • 工作就像一个魅力!谢谢!
【解决方案2】:

这会做你想做的事:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2014-04-14
    • 2016-07-09
    • 2014-08-14
    相关资源
    最近更新 更多