Skip to content

Instantly share code, notes, and snippets.

@vhoyer
Created April 25, 2018 14:14
Show Gist options
  • Save vhoyer/42101a8045e8da4235130aa607fa7744 to your computer and use it in GitHub Desktop.
Save vhoyer/42101a8045e8da4235130aa607fa7744 to your computer and use it in GitHub Desktop.
Xamarin Plugin that adds a loading modal
using Xamarin.Forms;
namespace vhoyer.XamPlugins.MoreModals
{
public class LoadingModal
{
private AbsoluteLayout layout;
private AbsoluteLayout AbsLoadingBG, AbsLoadingFG;
private ActivityIndicator ActLoading;
public LoadingModal(AbsoluteLayout layout)
{
InitiateComponents(layout);
}
public LoadingModal(AbsoluteLayout layout, bool startLoading)
{
InitiateComponents(layout);
startLoadingRoutine(startLoading);
}
public LoadingModal(ContentPage page)
{
InitiateComponents(page.Content);
page.Content = this.layout;
}
public LoadingModal(ContentPage page, bool startLoading)
{
InitiateComponents(page.Content);
page.Content = this.layout;
startLoadingRoutine(startLoading);
}
private void startLoadingRoutine(bool startLoading)
{
if (startLoading) {
Start();
return;
}
Stop();
}
private void InitiateComponents(View tempLayout)
{
var absLayout = new AbsoluteLayout();
absLayout.Children.Add(tempLayout);
InitiateComponents(absLayout);
}
private void InitiateComponents(AbsoluteLayout layout)
{
var tempLayout = layout.Children[0];
this.layout = layout;
this.layout.HorizontalOptions = LayoutOptions.FillAndExpand;
this.layout.VerticalOptions = LayoutOptions.FillAndExpand;
this.layout.Children.RemoveAt(0);
this.layout.Children.Add(tempLayout, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All);
this.AbsLoadingBG = new AbsoluteLayout {
IsVisible = false,
BackgroundColor = Color.Black,
Opacity = 0.5,
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.FillAndExpand,
};
this.layout.Children.Add(AbsLoadingBG, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All);
this.AbsLoadingFG = new AbsoluteLayout {
IsVisible = false,
VerticalOptions = LayoutOptions.FillAndExpand,
HorizontalOptions = LayoutOptions.FillAndExpand,
};
this.ActLoading = new ActivityIndicator {
IsVisible = false,
IsRunning = false,
VerticalOptions = LayoutOptions.Center,
HorizontalOptions = LayoutOptions.Center,
};
this.AbsLoadingFG.Children.Add(ActLoading, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All);
this.layout.Children.Add(AbsLoadingFG, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All);
}
public void Start()
{
AbsLoadingBG.IsVisible = true;
AbsLoadingFG.IsVisible = true;
ActLoading.IsVisible = true;
ActLoading.IsRunning = true;
}
public void Stop()
{
AbsLoadingBG.IsVisible = false;
AbsLoadingFG.IsVisible = false;
ActLoading.IsVisible = false;
ActLoading.IsRunning = false;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment