예제 #1
0
 public void RegisterBackButtonHandler(IBackButtonHandler handler)
 {
     if (!this.backButtonHandlers.Contains(handler))
     {
         this.backButtonHandlers.Add(handler);
     }
 }
예제 #2
0
 public void UnregisterBackButtonHandler(IBackButtonHandler handler)
 {
     if (this.backButtonHandlers.Contains(handler))
     {
         this.backButtonHandlers.Remove(handler);
     }
 }
예제 #3
0
        /// <inheritdoc/>
        public void RemoveHandler(IBackButtonHandler handler)
        {
            handler = handler ?? throw new ArgumentNullException(nameof(handler));

            var entry = _handlers.FirstOrDefault(e => e.Handler == handler);

            if (entry == null)
            {
                throw new KeyNotFoundException($"The specified handler named '{handler.Name}' was not found.");
            }

            _handlers.Remove(entry);
        }
예제 #4
0
        public async override void OnBackPressed()
        {
            IBackButtonHandler backButtonHandler = null;
            ViewModelBase      viewModel         = null;

            foreach (var fragment in this.GetFragmentManager().Fragments)
            {
                var page = fragment.GetType().GetProperty("Page")?.GetValue(fragment);

                if (page is StartPageView)
                {
                    viewModel = (ViewModelBase)(page as StartPageView).BindingContext;
                    if (viewModel.NavigationService.PreviousPageViewModel is StartPageViewModel)
                    {
                        backButtonHandler = viewModel as IBackButtonHandler;
                    }
                }

                if (page is LinkItemView)
                {
                    viewModel = (ViewModelBase)(page as LinkItemView).BindingContext;
                    if (viewModel.NavigationService.PreviousPageViewModel is LinkItemViewModel)
                    {
                        backButtonHandler = viewModel as IBackButtonHandler;
                    }
                }

                if (page is OptionsView)
                {
                    viewModel = (ViewModelBase)(page as OptionsView).BindingContext;
                    if (viewModel.NavigationService.PreviousPageViewModel is OptionsViewModel)
                    {
                        backButtonHandler = viewModel as IBackButtonHandler;
                    }
                }

                if (backButtonHandler != null)
                {
                    break;
                }
            }

            var backButtonHandled = await backButtonHandler?.HandleBackButton(viewModel);

            if (!backButtonHandled)
            {
                base.OnBackPressed();
            }
        }
예제 #5
0
        /// <inheritdoc/>
        public void AddHandler(IBackButtonHandler handler, int?priority = null)
        {
            handler = handler ?? throw new ArgumentNullException(nameof(handler));
            int entryPriority = priority ?? (_handlers.Any() ? _handlers.Max(e => e.Priority) + DefaultPriorityIncrement : DefaultPriorityIncrement);

            var entry = new BackButtonHandlerEntry(handler, entryPriority);

            _handlers.Add(entry);
            _handlers.Sort(comparison: CompareEntries);

            // Sorts by Priority, high to low.
            int CompareEntries(BackButtonHandlerEntry left, BackButtonHandlerEntry right)
            {
                return(right.Priority.CompareTo(left.Priority));
            }
        }
예제 #6
0
 /// <summary>
 /// Creates a new instance of <see cref="BackButtonHandlerEntry"/>.
 /// </summary>
 public BackButtonHandlerEntry(IBackButtonHandler handler, int priority)
 {
     Handler  = handler;
     Priority = priority;
 }
예제 #7
0
 public void UnregisterBackButtonHandler(IBackButtonHandler handler)
 {
 }
예제 #8
0
        /// <summary>
        /// Adds a <see cref="IBackButtonHandler"/> and return an <see cref="IDisposable"/> to conveniently remove it later.
        /// </summary>
        /// <param name="backButtonManager"></param>
        /// <param name="handler">The handler to add.</param>
        /// <param name="priority">The optional priority.</param>
        /// <returns>A disposable that will remove the handler when <see cref="IDisposable.Dispose"/> is invoked.</returns>
        public static IDisposable RegisterHandler(this IBackButtonManager backButtonManager, IBackButtonHandler handler, int?priority = null)
        {
            backButtonManager.AddHandler(handler, priority);

            return(new ActionDisposable(RemoveHandler));

            void RemoveHandler()
            {
                backButtonManager.RemoveHandler(handler);
            }
        }