WPF应用程序的GUI正在冻结

时间:2013-01-04 05:26:19

标签: wpf user-interface

加载整个GUI。单击某个按钮后,GUI没有响应:任何按钮都没有响应。如果我切换到其他应用程序并切换回来,GUI立即就可以了。 在单击按钮后面,它是一个向后端发送请求的句柄。我调试了应用程序,并且始终返回数据。 由于应用程序很庞大而且我不熟悉它,我无法提取发送请求和处理数据的简单模型。我想知道可能的原因,因为我现在不知道。

致以最诚挚的问候,

-----添加更多-----

后端请求发送在线程池线程中;获取数据时,不会直接更新UI控件。仅更新演示者(视图模型),它们绑定到UI控件。

2 个答案:

答案 0 :(得分:3)

我认为正如sa-ddam213所建议的那样,我也相信您正在后台ThreadTask执行代码块。

我认为问题是
  - 单击按钮,在后台开始执行   - 您保留了一个标记,用于检查Button CanExecute()的{​​{1}}后台处理是否正在运行。
  - 用户界面检查按钮的Command暂时CanExecute(),然后在此处另一个问题中提及Is Josh Smith's implementation of the RelayCommand flawed?。   - 后台进程返回   - UI不知道后台进程已经完成,并且因为它已经停止检查按钮Command的{​​{1}},UI将不会知道自己..(你需要告诉它)
  - 因此用户界面没有响应,但是当用户点击应用程序中的某个位置或按照你的说法进行输入输出时,它将再次返回。

<强>解决方案
- 通过使用InvalidateRequerySuggested方法,您可以在UI线程上调用命令requery,以便UI重新检查每个CanExecute()和/或Command CanExecute()的{​​{1}}。< / p>

Control
  

InvalidateRequerySuggested方法强制CommandManager引发RequerySuggested事件。 RequerySuggested事件通知命令源查询与其关联的命令,以确定命令是否可以执行。

更多参考:
  - How does CommandManager.RequerySuggested work?
  - MSDN - CommandManager
  - MSDN - CommandManager.InvalidateRequerySuggested Method

答案 1 :(得分:1)

这只是一个疯狂的猜测,但尝试删除点击事件中逻辑的优先级

实施例

private void Button_Click(object sender, RoutedEventArgs e)
{
    Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)delegate
    {
        // all your code here.
    });
}