MobilePage.xaml.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. UpdateBackgroundUpdateStatus();
  45. Host.BackgroundUpdateStatusChanged += BackgroundUpdateStatusChanged;
  46. UpdateTransportStatus();
  47. Host.TransportConnected += TransportConnected;
  48. Host.TransportDisconnected += TransportDisconnected;
  49. base.OnAppearing();
  50. }
  51. protected override void OnDisappearing()
  52. {
  53. ProgressVisible = false;
  54. Host.BackgroundUpdateStatusChanged -= BackgroundUpdateStatusChanged;
  55. Host.TransportConnected -= TransportConnected;
  56. Host.TransportDisconnected -= TransportDisconnected;
  57. base.OnDisappearing();
  58. }
  59. private void TransportDisconnected(TransportDisconnectedEventArgs args) => UpdateConnectionStatus();
  60. private void TransportConnected(TransportConnectedEventArgs args) => UpdateConnectionStatus();
  61. private void UpdateConnectionStatus()
  62. {
  63. Device.BeginInvokeOnMainThread(UpdateTransportStatus);
  64. }
  65. protected virtual void UpdateTransportStatus()
  66. {
  67. _connectionIndicator.IsVisible = !Host.IsConnected();
  68. }
  69. private void BackgroundUpdateStatusChanged(object sender, EventArgs args)
  70. {
  71. Device.BeginInvokeOnMainThread(UpdateBackgroundUpdateStatus);
  72. }
  73. private void UpdateBackgroundUpdateStatus()
  74. {
  75. _updateIndicator.IsVisible = Host.IsBackgroundUpdateStatusActive;
  76. }
  77. private async void _backButton_OnClicked(object sender, EventArgs e)
  78. {
  79. if (await OnBackButtonClicked())
  80. Navigation.PopAsync();
  81. // if (OnBackButtonPressed())
  82. // {
  83. // if (await ConfirmChanges())
  84. // var args = new BackButtonClickedEventArgs() { Cancel = false };
  85. // BackButtonClicked?.Invoke(this, args);
  86. // if (!args.Cancel)
  87. //
  88. // }
  89. }
  90. protected virtual async Task<bool> OnBackButtonClicked()
  91. {
  92. return true;
  93. }
  94. protected async Task<bool> ConfirmChanges(IShell item)
  95. {
  96. if (item.IsChanged())
  97. {
  98. var choice = await MaterialDialog.Instance.SelectActionAsync("Confirm Cancel?",
  99. new string[] { "Yes, Cancel", "Keep Editing", "Save Changes" });
  100. if (choice == 0)
  101. item.Cancel();
  102. else if (choice == 2)
  103. item.Save("Saved on Mobile Device");
  104. else // Cancel (choice==1) or Tap outside box
  105. return false;
  106. Dispatcher.BeginInvokeOnMainThread(() => Navigation.PopAsync());
  107. return false;
  108. }
  109. return true;
  110. }
  111. protected void ShowPopup(Func<View> view, int height = 500, int width = 300, int padding = 10)
  112. {
  113. _popup.PopupView.HeightRequest = height;
  114. _popup.PopupView.WidthRequest = width;
  115. _popup.PopupView.ShowHeader = false;
  116. _popup.PopupView.ShowFooter = false;
  117. _popup.PopupView.ContentTemplate = new DataTemplate(() =>
  118. {
  119. Grid grid = new Grid() { Margin = padding, Padding = padding};
  120. grid.Children.Add(view());
  121. return grid;
  122. });
  123. _popup.Show();
  124. }
  125. protected void DismissPopup()
  126. {
  127. _popup.Dismiss();
  128. }
  129. public bool ProgressVisible
  130. {
  131. get => activity_indicator.IsBusy;
  132. set
  133. {
  134. activity_frame.IsVisible = value;
  135. activity_indicator.IsBusy = value;
  136. }
  137. }
  138. }
  139. }