如何在WPF中的异步操作期间阻止UI

如何在WPF中的异步操作期间阻止UI,wpf,asynchronous,backgroundworker,Wpf,Asynchronous,Backgroundworker,我们有一个WPF应用程序(实际上是一个VSTO WPF应用程序)。在某些控件上,有多个元素,单击这些元素时,从web服务加载数据并更新UI。现在,我们同步执行这些web请求,阻塞UI线程,直到响应返回。这可以防止用户在加载数据时在应用程序周围单击,从而在返回数据时将其置于无效状态以处理数据 当然,如果请求花费很长时间,应用程序就会失去响应。理想情况下,我们希望在这段时间内激活“取消”按钮,而不是别的。有没有一种聪明的方法可以做到这一点,或者我们必须使用backgroundworker将请求切换为

我们有一个WPF应用程序(实际上是一个VSTO WPF应用程序)。在某些控件上,有多个元素,单击这些元素时,从web服务加载数据并更新UI。现在,我们同步执行这些web请求,阻塞UI线程,直到响应返回。这可以防止用户在加载数据时在应用程序周围单击,从而在返回数据时将其置于无效状态以处理数据

当然,如果请求花费很长时间,应用程序就会失去响应。理想情况下,我们希望在这段时间内激活“取消”按钮,而不是别的。有没有一种聪明的方法可以做到这一点,或者我们必须使用backgroundworker将请求切换为异步执行,并编写一些在请求进行时禁用除“取消”按钮之外的所有控件的内容


编辑:对于我们已经期望长期运行的操作(下载文件等),我们会弹出一个进度对话框窗口。这方面的例子是,当您期望操作非常快(最多几秒钟),但有时需要更长的时间。在这种情况下,在整个窗口上闪烁片刻有点太分散注意力。

当您在单独的线程上发出异步请求时,显示一个带有取消按钮的模式对话框(可能还有一个进度条或其他一些活动指示器)


这样,用户就无法与底层用户界面进行交互,他们仍然可以得到反馈,知道正在发生什么事情……并且可以取消它。

除了禁用“取消”之外,我想不出其他简单的方法

话虽如此,如果只显示一个“正在工作”或“正在进行”对话框,只需一个“取消”按钮,可能会给用户带来更好的体验


您可以使用此dailog来显示有关web请求进度的有用信息以及可能返回的任何错误消息。

一种方法是在等待响应时无法访问的UI部分上放置一块半透明画布,并在中间放置一条带有取消按钮的消息。

您可单击的控件应绑定到命令,并且当后台任务正在进行时,命令应具有
CanBeExecuted
返回false。如果执行此操作,绑定到这些命令的控件将自动禁用和启用它们自己

通过创建一个实现后台任务进行中检查的命令类,然后从该类派生所有命令(当然,取消命令除外),可以避免重复大量代码。

具有BusyIndicator控件。该工具包是开源的,因此您可以轻松地将其移植到WPF

当在代码中或通过将其绑定到模型将其
IsBusy
属性设置为true时,它将禁用并灰显分配给它的区域中的所有内容。用法如下:

<ctl:BusyIndicator>
    <StackPanel x:Name="myDataArea">
        <Button Content="Load Data" />
        <DataGrid x:Name="myDataGrid" />
    </StackPanel>
</ctl:BusyIndicator>


cancel按钮在请求开始之前就已经可见,但我想我们可以给它一个更高的z-indexIt。可以将多个按钮绑定到同一个命令。当然-我只是在考虑如何在不创建两个相同的cancel按钮(其中一个位于另一个之上)的情况下执行此操作