Изменить элемент управления из фонового рабочего.Не существует - PullRequest
0 голосов
/ 14 февраля 2019

Я сделал фоновый рабочий в своем окне, и он прекрасно работает.Код начинает становиться длинным, поэтому я решил создать рабочий класс и поместить всю свою логику туда.Однако, когда я это делаю, я больше не могу изменять значение моего индикатора выполнения.

Я получаю «не существует в текущем контексте».Интересно, это как-то связано с тем, что это в отдельном потоке ??Я также исследовал это, и я не нашел объяснения или решения.

Я сделал свой индикатор прогресса в 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;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Это будет делать то, что вы хотите:

Отправить ссылку вашего 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;
}
0 голосов
/ 14 февраля 2019

Проблема в том, что индикатор выполнения существует в вашем MainWindow, а не в File_Worker.

Когда весь код работника был внутри MainWindow, он мог легко получить доступ к индикатору выполнения.Но File_Worker не знает, откуда взять индикатор выполнения.


Самое простое решение - передать все необходимые объекты пользовательского интерфейса (например, индикатор выполнения) в рабочий класс.в своем конструкторе сохраните указанные объекты в поле (ах) и обращайтесь к ним везде, где это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...