Я думаю, что для этого нужно использовать BusyIndicator.
Вы бы сослались на это:
xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
Затем используйте BusyIndicator следующим образом (обратите внимание на привязку).
<toolkit:BusyIndicator x:Name="busyIndicator" IsBusy="{Binding Path=IsBusy}">
<toolkit:BusyIndicator.BusyContent>
<StackPanel>
<TextBlock >Fetching data...</TextBlock>
<Rectangle RadiusX="10" RadiusY="10" Fill="#80000000" />
</StackPanel>
</toolkit:BusyIndicator.BusyContent>
....... XAML Code here
</toolkit:BusyIndicator>
Затем в вашей ViewModel вы вызываете свойство IsBusy всякий раз, когда вызываете сервис для извлечения данных или любого другого необходимого процесса (я использую GalaSoft.MvvmLight).
RaisePropertyChanged("IsBusy");