0

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

最好的祝福,

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

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

4

2 回答 2

3

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

我认为问题在于
- 单击按钮时,在后台开始执行。
- 您保留了一个标志,用于检查CanExecute()Button 的后台进程是否正在运行Command
- 用户界面检查CanExecute()按钮Command一段时间,然后没有在这里的另一个问题中提到 - Josh Smith 的 RelayCommand 实现是否有缺陷?.
- 在后台处理退货。
- UI 不知道后台进程已完成,并且由于它已停止检查CanExecute()Button 的Command,UI 不会知道自己..(您需要告诉它)
- 因此 UI 没有响应,但是当用户单击某处时应用程序或按照您所说的进行输入输出,它将再次返回。

解决方案
- 通过使用InvalidateRequerySuggested方法,您可以在 UI 线程上调用命令 requery,以便 UI 将重新检查CanExecute()for eachControl和/或Button Command.

// Forcing the CommandManager to raise the RequerySuggested event
CommandManager.InvalidateRequerySuggested();

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

有关更多信息,请参阅:
- CommandManager.RequerySuggested 如何工作?
- MSDN - CommandManager
- MSDN - CommandManager.InvalidateRequerySuggested 方法

于 2013-01-04T06:17:39.420 回答
1

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

例子

private void Button_Click(object sender, RoutedEventArgs e)
{
    Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)delegate
    {
        // all your code here.
    });
}
于 2013-01-04T05:41:15.723 回答