C# 从后台工作程序修改控件。不存在
我在我的窗口中做了一个后台工作人员,效果很好。代码开始变长了,所以我决定创建一个worker类,并将所有逻辑放在其中。但是,当我这样做时,我将无法再修改进度条的值 我得到一个“在当前上下文中不存在”。我想知道这是否和这是在一个单独的线程上的事实有关??我也研究过,但没有找到解释或解决办法 我在XAML中公开了我的进度条,但这没有什么区别 这是我的主窗口代码。我看这里没有问题C# 从后台工作程序修改控件。不存在,c#,.net,xaml,C#,.net,Xaml,我在我的窗口中做了一个后台工作人员,效果很好。代码开始变长了,所以我决定创建一个worker类,并将所有逻辑放在其中。但是,当我这样做时,我将无法再修改进度条的值 我得到一个“在当前上下文中不存在”。我想知道这是否和这是在一个单独的线程上的事实有关??我也研究过,但没有找到解释或解决办法 我在XAML中公开了我的进度条,但这没有什么区别 这是我的主窗口代码。我看这里没有问题 using System; using System.Collections.Generic; using System.
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;
}
}
}
问题是进度条存在于
主窗口中,但不存在于文件中
当所有工作人员的代码都在主窗口中时,它可以轻松访问进度条。但是文件工作者不知道从哪里获取进度条
最简单的解决方案是将所有需要的UI对象(例如,进度条)传递给构造函数中的worker类,将所述对象存储在字段中,并在需要时访问它们。这将满足您的需要:
将主窗口的引用发送到文件\u 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);
}
}
错误发生在哪一行?另外:堆栈跟踪如何,完整异常如何?(x.ToString()
)@keim-这是最后一行。fileProgressBar.IsIndeterminate=false;我早就试过了。public File_Worker(object fileProgressBar)问题是该对象没有属性。还是使用对象的类型不对?@Pirate:Whyobject
而不是ProgressBar
?效果很好!非常感谢。
void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
_mainWin.progressBar.Value = e.ProgressPercentage;
}