Just use StackLayout with ActivityIindicator and WebView as children and set it's visibility based on IsWorking property value which is set in WebView.Navigating and WebView.Navigated events. Your ViewModel has to implement IOnPropertyChanged.
var webViewView = new WebView() {
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
};
webViewView.SetBinding<YourViewModel>(View.IsVisibleProperty, v => v.IsWorking,
BindingMode.OneWay, new Converters.NegateBoolConverter());
webViewView.Navigating += (sender, e) => {
viewModel.IsWorking = true;
};
webViewView.Navigated += (sender, e) => {
viewModel.IsWorking = false;
};
var activityIndicator = new ActivityIndicator() {
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center,
};
activityIndicator.SetBinding<YourViewModel>(ActivityIndicator.IsRunningProperty, v => v.IsWorking);
var isWorkingView = new ContentView() {
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
Content = activityIndicator
};
isWorkingView.SetBinding<YourViewModel>(ContentView.IsVisibleProperty, v => v.IsWorking);
var root = new StackLayout() {
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
Children = {
webViewView,
isWorkingView,
}
};