Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在长时间运行的过程中禁用鼠标单击?_C#_Wpf - Fatal编程技术网

C# 在长时间运行的过程中禁用鼠标单击?

C# 在长时间运行的过程中禁用鼠标单击?,c#,wpf,C#,Wpf,我有一个问题,当一个按钮被点击,这个过程需要一段时间,用户点击GUI屏幕上的其他位置。这些按钮单击会在调度程序中排队,因此在初始按钮单击后,其他位置会被单击。我想防止这种情况发生,以便其他UI控件在处理完成后不会被单击 我能想到的唯一解决方案是在鼠标事件中p/invoke,并防止在处理按钮单击时将它们传递给应用程序。这是最好的方法吗?解决这一问题的一个简单方法是使用某种半透明的覆盖(可能包含进度信息),当有长时间运行的任务正在进行时,会弹出这种覆盖。这将可靠地禁用整个UI,直到您删除覆盖(这使您

我有一个问题,当一个按钮被点击,这个过程需要一段时间,用户点击GUI屏幕上的其他位置。这些按钮单击会在调度程序中排队,因此在初始按钮单击后,其他位置会被单击。我想防止这种情况发生,以便其他UI控件在处理完成后不会被单击


我能想到的唯一解决方案是在鼠标事件中p/invoke,并防止在处理按钮单击时将它们传递给应用程序。这是最好的方法吗?

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

如果此过程需要一段时间,通常建议在工作线程中而不是在GUI线程中执行此过程。因此,请使用如下所示的
BackgroundWorker
方法,然后使用与指定按钮关联的命令的
CanExecute
方法,如下所示:


编辑:

您可以将其他控件的
IsEnabled
属性绑定到命令的CanExecute方法的结果



这不起作用,因为当我单击该窗口时,按钮单击仍在调度程序中排队。因此,当单击完成,我关闭窗口时,排队的单击开始触发。这听起来好像你没有在后台线程上运行长期运行的任务。这应该是你改变的第一件事。一旦你这样做了,我建议的方法将在运行时禁用所有控件(鼠标点击不会排队,它们将被覆盖处理,基本上只是丢弃它们)。起初,我没有意识到您没有在后台线程上运行该进程。这是一个很好的示例,说明了如何在单击后禁用单个按钮,但是它不会阻止在处理按钮命令执行处理程序时单击其他按钮或像combobox这样的UI组件。