禁用鼠标点击

禁用鼠标点击

问题描述:

我遇到一个问题,点击某个按钮并且过程需要一段时间后,用户在GUI屏幕上单击其他位置。这些按钮点击会在调度程序中排队,因此在初始按钮点击后,其他位置会被点击。我想阻止这种情况发生,所以其他UI控件在完成处理后不会被点击。我能想到的唯一解决方案就是锁定鼠标事件并防止它们在按钮点击正在处理时传递给应用程序。这是最好的方法吗?禁用鼠标点击

如果该过程需要一段时间,通常建议在工作线程而不是GUI线程中执行此类过程。因此,使用BackgroundWorker办法想在这个CodeProject article,然后使用具有特定的按钮关联的命令CanExecute方法,就像这里:

WPF Commanding – When do Commands re-evaluate their CanExecute method?
WPF – CanExecute refreshed

编辑:

可以绑定的IsEnabled财产您的其他控件为Command的CanExecute方法的结果。

How to disable combobox when command canExecute returns false
How to bind a ComboBoxItem's IsEnabled property to the result of a Command's CanExecute method

+0

这些是如何在单击后禁用单个按钮的很好的示例,但是它不会阻止在处理按钮命令执行处理程序时单击其他按钮或UI组件(如组合框)。 – Robert 2011-05-16 16:20:15

+0

@Robert:编辑我的答案。 – Paya 2011-05-16 16:33:06

解决这个问题的一个更简单的方法是在某些长时间运行的任务正在进行时弹出一些半透明覆盖图(可能包含进度信息)。这将可靠地禁用整个用户界面,直到您删除覆盖(这使您不必执行大量更改/绑定IsEnabled属性)。

+0

这不会工作,因为按钮点击在调度员仍在排队,当我点击该窗口上。因此,当点击完成后,我忽略了窗口,排队的点击开始启动。 – Robert 2011-05-16 16:18:18

+0

这对我来说听起来像是你没有在后台线程上运行长时间运行的任务。这应该是你改变的第一件事。一旦你这样做了,我建议在运行时禁用所有的控件(鼠标点击不会排队,它们会被覆盖层处理,实质上只是丢弃它们)。最初,我并没有意识到你没有在后台线程上运行这个进程。 – Tim 2011-05-16 16:20:43