我想在WPF应用中更新TextBlock
的文本。我正在使用BackgroundWorker
来对更新方法进行异步调用。
修改
我在发帖前看过问题:Progress Bar update from Background worker stalling
。我的问题不同之处在于我只想在调用可能长时间运行的服务调用之前将文本更改为“正在加载...”。我希望我的实现尽可能可重用,并且不需要也不能跟踪进度。然后,我打算将文本块文本更改回上一条消息。
我已在新的WPF项目中对此问题进行了建模,并遇到了同样的问题。
在数据网格开始单元格编辑事件开始时,文本更改为“正在加载...”,并在加载必要数据时将其设置回其先前的值。
我目前的问题是文本似乎更改为“正在加载...”并在单元格开始编辑事件结束时立即返回。我确信在通话之间有很长时间,甚至尝试Wait(10000)
。我运行它时没有看到“正在加载”文本。
我的实施(注意:我已经尝试删除using
封闭,没有更改):
using(BackgroundWorker bw = new BackgroundWorker())
{
bw.WorkerReportsProgress = true;
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync("Loading...");
};
在抓取数据后,再次调用grdBlah_BeginningEdit
内调用的上述代码,文本已更改。
void bw_DoWork(object sender, DoWorkEventArgs e)
{
try
{
if (((BackgroundWorker)sender).CancellationPending)
{
e.Cancel = true;
return;
}
UpdateDelegate update = new UpdateDelegate(UpdateText);
this.Dispatcher.BeginInvoke(update, e.Argument);
// I have also tried: txtSearchCollection.Dispatcher.BeginInvoke(update, e.Argument);
}
catch (Exception ex)
{
bool brake = true; // used to apply a breakpoint
}
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
worker.DoWork -= new DoWorkEventHandler(bw_DoWork);
}
catch (Exception ex)
{
bool brake = true;
}
}
private delegate void UpdateDelegate(string s);
private void UpdateText(string s)
{
txtSelectedCollection.Text = s;
}
非常感谢任何帮助。