【问题标题】:WPF - Datagrid selection changed with background workerWPF - 后台工作人员更改了数据网格选择
【发布时间】:2014-10-29 16:06:00
【问题描述】:

我正在编写一个通过串行端口从设备读取信息的程序。我有一个数据网格中可用设备的列表。当用户单击一行时,它会从设备中获取信息并将其显示在单独的列表中。设备响应和填充信息通常需要大约一秒钟的时间。但是,在这一秒内,数据网格行不会突出显示为选中状态。因此,从鼠标单击数据网格行到实际显示为突出显示/选中需要大约一秒钟。

我认为使用后台工作线程是最好的选择,但我使用下面的代码得到了相同的结果。我是否使用不正确,或者我应该做些什么来选择数据网格行?

private void relayList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += GetLinks;
    worker.RunWorkerAsync();
}

 private void GetLinks(object sender, DoWorkEventArgs e)
 {
    //send message to viewModel and do time-consuming work here
}

【问题讨论】:

  • 不是在 SelectionChanged 事件中读取,而是在 MouseUp 事件中读取,当然条件是确定是否应该开始读取。
  • 您确定约 1 秒的延迟表示等待设备所花费的时间,而不是更新 UI 作为响应所花费的时间吗?最好在在这里花费太多时间之前验证这一点。还要确保在进行计算时,您没有从视图模型中将自己编组回 Dispatcher
  • 抱歉耽搁了,我被叫走了。感谢您的回复;我会同时尝试并更新。
  • 你有没有在下面给出我的答案?
  • @DaleFrancis 我真的很感激这个答案,但我不太明白。我正在阅读它并现在尝试。

标签: wpf datagrid backgroundworker


【解决方案1】:

BackgroundWorker 有一个 RunWorkerCompleted 方法。它将在 UI 线程的执行上下文中运行。

还有一个 result 属性用于将结果传递给下一个方法,即 RunWorkerCompleted 方法。

private void yourMethod()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += DoWorkMethod;
    worker.RunWorkerCompleted += RunWorkerCompletedMethod;
    worker.RunWorkerAsync();
}

private void RunWorkerCompletedMethod(object sender, RunWorkerCompletedEventArgs e)
{
    string result = (string)e.Result;

    // do stuff here
}

private void DoWorkMethod(object sender, DoWorkEventArgs e)
{
    e.Result = string.Empty; // Your device data
}

如果您非常不想使用已完成的方法。不要使用调度程序,而是使用 SynchronizationContext。

您需要在首次运行表单时将 SynchronizationContext.Current 存储在字段中,但之后您可以在 UI 线程上调用所需的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多