不要使用装饰器——我所做的是有两个独立的容器控件(通常是网格),它们占据屏幕的同一区域。一个是我的“进度”控件,另一个是我的“内容”控件。我将进度控件的可见性设置为 Collapsed,并将内容控件的可见性默认设置为 Visible。
如果您以这种方式进行设置,当您启动对 web 服务的异步调用时,您可以使进度控件可见并且内容控件折叠。当 web 服务完成时,让它使用 Dispatcher.BeginInvoke 更新 UI,然后将进度控件切换回折叠状态,并将内容控件切换回可见状态。
我通常使进度控制不确定。这是一个例子;在此,我有一个名为 ProgressGrid 的单独的用户控件,它有我的进度条。
<Grid x:Name="layoutRoot">
<Grid x:Name="contentGrid" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Visible">
<!-- snip -->
</Grid>
<controls:ProgressGrid x:Name="progressGrid" Text="Signing in, please wait..." Visibility="Collapsed"/>
</Grid>
在后面的代码中,就像这样简单:
private void SignInCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
contentGrid.Visibility = Visibility.Collapsed;
progressGrid.Visibility = Visibility.Visible;
}