用户界面-一个WPF应用程序的GUI冻结



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

最诚挚的问候,

——添加更多——

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

我认为正如sa-ddam213所建议的,我也相信你正在后台线程或任务中执行代码块。

我认为问题在于
- On按钮点击,开始在后台执行。
-您保留了一个标志,用于检查CanExecute()的后台进程是否正在运行按钮的Command
- UI检查CanExecute()按钮的Command一段时间,然后不像在另一个问题中提到的那样在这里-是乔什史密斯的RelayCommand的实现有缺陷吗?-进程返回后台。
UI不知道后台进程已经完成,因为它已经停止检查CanExecute()按钮的Command, UI将不会知道自己。(你需要告诉它)
-因此UI没有响应,但是当用户点击应用程序中的某个地方或像你说的那样进行输入输出时,它会再次返回。

<<p> 解决方案/strong>
-通过使用InvalidateRequerySuggested方法,您可以在UI线程上调用命令查询,以便UI将为每个Control和/或Button Command重新检查CanExecute()
// Forcing the CommandManager to raise the RequerySuggested event
CommandManager.InvalidateRequerySuggested();

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

更多信息请参考:
—CommandManager如何?RequerySuggested工作吗?
- MSDN - CommandManager
—MSDN—CommandManager。InvalidateRequerySuggested Method

这只是一个大胆的猜测,但尝试放弃逻辑的优先级在你的点击事件

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

最新更新