Не идите с обожателем - у меня есть два отдельных элемента управления контейнером (обычно сетки), которые занимают одну и ту же область экрана. Одним из них является мой контроль «прогресса», а другим - мой контроль «контента». Я установил видимость элемента управления прогрессом в Collapsed и видимость элемента управления содержимым в Visible по умолчанию.
Если он настроен таким образом, при запуске асинхронного вызова веб-службы вы можете сделать видимым элемент управления прогрессом и свернуть его. Когда веб-служба завершит работу, используйте Dispatcher.BeginInvoke, чтобы обновить пользовательский интерфейс, и в этот момент переключите управление выполнением обратно на свернутый, а управление содержимым - на видимое.
Я обычно делаю управление прогрессом неопределенным. Вот пример; в этом у меня есть отдельный UserControl с именем 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;
}