我们有一个WPF应用程序(实际上是一个VSTO WPF应用程序)。在某些控件上有多个元素,单击它们时,从Web服务加载数据并更新UI。现在,我们同步执行这些Web请求,阻止UI线程,直到响应返回。这可以防止用户在加载数据时单击应用程序,可能会使其处于无效状态,以便在返回数据时处理数据。
当然,如果请求需要很长时间,应用程序将无法响应。理想情况下,我们希望在此期间让取消按钮处于活动状态,但没有别的。有没有一种聪明的方法可以做到这一点,或者我们是否必须使用backgroundworker将请求切换为异步执行,并在请求正在进行时写一些禁用除取消按钮之外的所有控件的内容?
编辑:对于我们已经期望长时间运行的动作(下载文件等),我们会弹出一个进度对话框窗口。一个恰当的例子是你希望动作非常快(最多几秒钟),但偶尔需要更长时间。在这种情况下,闪烁整个窗口片刻会让人分心。
答案 0 :(得分:4)
您的可点击控件应该绑定到命令,并且当后台任务正在进行时,命令应该CanBeExecuted
返回false。如果这样做,绑定到这些命令的控件将自动禁用并启用它们。
您可以通过创建一个实现后台任务进行检查的命令类来避免重复大量代码,然后从此类派生所有命令(当然除了取消命令)。
答案 1 :(得分:1)
当您在单独的线程上发出异步请求时,请显示带有取消按钮的模态对话框(可能还有进度条或其他一些活动指示符)。
这样,用户就无法与底层用户界面进行交互,他们仍然可以获得有关正在发生的事情的反馈......以及取消它的能力。
答案 2 :(得分:1)
一种方法是将半透明画布放在UI的各个部分上,这些部分在等待响应时无法访问,并且在中心放置带有取消按钮的消息。
答案 3 :(得分:1)
Silverlight Toolkit有一个BusyIndicator控件。该工具包是开源的,因此您可以轻松地将其移植到WPF。
在代码中将IsBusy
属性设置为true或将其绑定到模型时,它会禁用并灰显分配给它的区域中的所有内容。用法如下:
<ctl:BusyIndicator>
<StackPanel x:Name="myDataArea">
<Button Content="Load Data" />
<DataGrid x:Name="myDataGrid" />
</StackPanel>
</ctl:BusyIndicator>
答案 4 :(得分:0)
话虽如此,如果您只使用取消按钮显示“工作”或进度对话框,它可能会让用户更有经验。
您可以使用此dailog显示有关Web请求进度的有用信息以及可能返回的任何错误消息。