How can I display a Message box or some other similar notice show while the application is busy in the background, similar to this mockup:

How can I display a Message box or some other similar notice show while the application is busy in the background, similar to this mockup:

 
    
    There is a Busy Indicator in the WPF Extended Toolkit which I've used quite a lot:

The toolkit is conveniently available through NuGet which makes it really easy to add it as a reference to your project. I've personally used it (along with many of the other useful controls in that toolkit) in almost all of my recent WPF projects.
To use it, surround your controls in the XAML code with the busy indicator:
<extToolkit:BusyIndicator ...>
    <Grid>
        <Button Content="Click to do stuff" />
        <!-- your other stuff here -->
    </Grid>
</extToolkit:BusyIndicator>       
Then you just have to set the IsBusy property to true when you want the popup to appear and false when it should be hidden. In a proper MVVM architecture, you would typically databind the property in XAML to a property in your viewmodel which you then set to true/false accordingly:
<extToolkit:BusyIndicator IsBusy="{Binding IsBusy}" >
But if you aren't using MVVM, you can of course set it manually from your code behind, typically in the button click handler:
Give the control a name to be able to refer to it from code:
<extToolkit:BusyIndicator x:Name="busyIndicator" >
And then, in your xaml.cs file:
void myButton_Click(object sender, RoutedEventArgs e)
{
    busyIndicator.IsBusy = true;
    // Start your background work - this has to be done on a separate thread,
    // for example by using a BackgroundWorker
    var worker = new BackgroundWorker();
    worker.DoWork += (s,ev) => DoSomeWork();
    worker.RunWorkerCompleted += (s,ev) => busyIndicator.IsBusy = false;
    worker.RunWorkerAsync();
}
 
    
    If you code MVVM it's easy:
1.)Add a Boolean Flag "IsBusy" to your ViewModel with change notification.
public bool IsBusy {get {return _isBusy;} set{_isBusy=value;OnPropertyChanged("IsBusy");}}
private bool _isBusy;
2.) Add two events to your Command "Started" and "Completed"
public event Action Completed;
public event Action Started;
3.) In your ViewModel, subscribe to those events and set the busy status.
LoadImagesCommand.Started += delegate { IsBusy = true; };
LoadImagesCommand.Completed += delegate { IsBusy = false; };
4.) In your Window, you can now bind to that status
<Popup Visibility="{Binding Path=IsBusy,Converter={StaticResource boolToVisibilityConverter}}"/>
Note that for the last step you must instanciate the boolToVisibilityConverter, so:
5.) Add the following to any loaded Resource Dictionary:
<BooleanToVisibilityConverter x:Key="boolToVisibilityConverter"/>
That's it! You can fill your Popup with the life you want...
