MobilePage.xaml.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using Syncfusion.XForms.Core;
  5. using Syncfusion.XForms.PopupLayout;
  6. using Xamarin.Forms;
  7. using Xamarin.Forms.Xaml;
  8. using XF.Material.Forms.UI.Dialogs;
  9. namespace InABox.Mobile
  10. {
  11. // public class BackButtonClickedEventArgs : CancelEventArgs
  12. // {
  13. //
  14. // }
  15. //
  16. // public delegate void BackButtonClickedEvent(object sender, BackButtonClickedEventArgs args);
  17. [XamlCompilation(XamlCompilationOptions.Compile)]
  18. public partial class MobilePage
  19. {
  20. public static IModelHost Host { get; set; }
  21. public IList<View> AlternateMenu => _alternateMenu.Children;
  22. public IList<View> PrimaryMenu => _primaryMenu.Children;
  23. public IList<View> PageContent => _content.Children;
  24. public bool BackButtonEnabled
  25. {
  26. get => _backButton.IsVisible;
  27. set => _backButton.IsVisible = value;
  28. }
  29. //public event BackButtonClickedEvent BackButtonClicked;
  30. private SfPopupLayout _popup = new SfPopupLayout();
  31. public MobilePage()
  32. {
  33. InitializeComponent();
  34. activity_indicator.BackgroundColor = XF.Material.Forms.Material.Color.Primary;
  35. activity_indicator.TextColor = XF.Material.Forms.Material.Color.OnPrimary;
  36. _titleBar.BackgroundColor = XF.Material.Forms.Material.Color.Primary;
  37. _titleLabel.TextColor = XF.Material.Forms.Material.Color.OnPrimary;
  38. BackgroundColor = Color.WhiteSmoke;
  39. }
  40. protected override void OnAppearing()
  41. {
  42. ProgressVisible = false;
  43. XF.Material.Forms.Material.PlatformConfiguration.ChangeStatusBarColor(XF.Material.Forms.Material.Color.PrimaryVariant);
  44. Host.TransportConnected += TransportConnected;
  45. Host.TransportDisconnected += TransportDisconnected;
  46. UpdateTransportStatus();
  47. base.OnAppearing();
  48. }
  49. protected override void OnDisappearing()
  50. {
  51. ProgressVisible = false;
  52. Host.TransportConnected -= TransportConnected;
  53. Host.TransportDisconnected -= TransportDisconnected;
  54. base.OnDisappearing();
  55. }
  56. private void TransportDisconnected(TransportDisconnectedEventArgs args) => UpdateConnectionStatus();
  57. private void TransportConnected(TransportConnectedEventArgs args) => UpdateConnectionStatus();
  58. private void UpdateConnectionStatus()
  59. {
  60. Device.BeginInvokeOnMainThread(UpdateTransportStatus);
  61. }
  62. //private static Task<IMaterialModalPage> _snackbar = null;
  63. protected virtual void UpdateTransportStatus()
  64. {
  65. // ConnectionIndicator.Image = App.Data.IsConnected()
  66. // ? ImageSource.FromFile("transparent.png")
  67. // : ImageSource.FromFile("disconnected.png"); //ImageSource.FromFile("Images/nodata.png");
  68. _connectionIndicator.IsVisible = !Host.IsConnected();
  69. // if (!App.Data.IsConnected() && (_snackbar == null))
  70. // _snackbar = MaterialDialog.Instance.LoadingSnackbarAsync(message: "No Connection Available!");
  71. //
  72. // else if (App.Data.IsConnected() && (_snackbar != null) && (_snackbar.Result != null))
  73. // {
  74. // _snackbar.Result.DismissAsync();
  75. // _snackbar = null;
  76. // }
  77. }
  78. private async void _backButton_OnClicked(object sender, EventArgs e)
  79. {
  80. if (await OnBackButtonClicked())
  81. Navigation.PopAsync();
  82. // if (OnBackButtonPressed())
  83. // {
  84. // if (await ConfirmChanges())
  85. // var args = new BackButtonClickedEventArgs() { Cancel = false };
  86. // BackButtonClicked?.Invoke(this, args);
  87. // if (!args.Cancel)
  88. //
  89. // }
  90. }
  91. protected virtual async Task<bool> OnBackButtonClicked()
  92. {
  93. return true;
  94. }
  95. protected async Task<bool> ConfirmChanges(IShell item)
  96. {
  97. if (item.IsChanged())
  98. {
  99. var choice = await MaterialDialog.Instance.SelectActionAsync("Confirm Cancel?",
  100. new string[] { "Yes, Cancel", "Keep Editing", "Save Changes" });
  101. if (choice == 0)
  102. item.Cancel();
  103. else if (choice == 2)
  104. item.Save("Saved on Mobile Device");
  105. else // Cancel (choice==1) or Tap outside box
  106. return false;
  107. Dispatcher.BeginInvokeOnMainThread(() => Navigation.PopAsync());
  108. return false;
  109. }
  110. return true;
  111. }
  112. protected void ShowPopup(Func<View> view, int height = 500, int width = 300, int padding = 10)
  113. {
  114. _popup.PopupView.HeightRequest = height;
  115. _popup.PopupView.WidthRequest = width;
  116. _popup.PopupView.ShowHeader = false;
  117. _popup.PopupView.ShowFooter = false;
  118. _popup.PopupView.ContentTemplate = new DataTemplate(() =>
  119. {
  120. Grid grid = new Grid() { Margin = padding, Padding = padding};
  121. grid.Children.Add(view());
  122. return grid;
  123. });
  124. _popup.Show();
  125. }
  126. protected void DismissPopup()
  127. {
  128. _popup.Dismiss();
  129. }
  130. public bool ProgressVisible
  131. {
  132. get => activity_indicator.IsBusy;
  133. set
  134. {
  135. activity_frame.IsVisible = value;
  136. activity_indicator.IsBusy = value;
  137. }
  138. }
  139. }
  140. }