public void GoForward() { if (CanGoForward) { InnerNavigate(ForwardStack.Last(), NavigationMode.Forward); } }
public void ClearHistory(int level) { ForwardStack.Clear(); while (BackStack.Count > level) { BackStack.RemoveAt(level); } }
//[IsKeepAlive() moved to NavigationService.IsContentKeepAlive()] internal void UpdateView() { BackStack.OnCollectionChanged(); ForwardStack.OnCollectionChanged(); if (_backForwardStateChange != null) { _backForwardStateChange(this, EventArgs.Empty); } }
private async Task GoBackAsync() { BackStack.Remove(CurrentItem); ForwardStack.Add(CurrentItem); if (BackStack.Count > 0) { CurrentItem = BackStack.Last(); } await ReloadAsync(); }
private async Task GoForwardAsync() { if (ForwardStack.Count > 0) { CurrentItem = ForwardStack.Last(); } ForwardStack.Remove(CurrentItem); BackStack.Add(CurrentItem); await ReloadAsync(); }
private void AddToForwardStack( IViewModel viewModel, FrameworkElement content) { var origin = new WeakNavigationStackEntry( viewModel, content); ForwardStack.Add(origin); }
public Frame() { var backStack = new ObservableCollection <PageStackEntry>(); var forwardStack = new ObservableCollection <PageStackEntry>(); backStack.CollectionChanged += (s, e) => CanGoBack = BackStack.Any(); forwardStack.CollectionChanged += (s, e) => CanGoForward = ForwardStack.Any(); BackStack = backStack; ForwardStack = forwardStack; }
public void GoForward() { if (CurrentItem != null) { BackStack.Push(CurrentItem); } if (ForwardStack.Count > 0) { CurrentItem = ForwardStack.Pop(); } OnStackChanged(); }
public void Resume(Stream stream, Navigator navigator) { var deserializer = new DataContractJsonSerializer(typeof(FrameStack), new DataContractJsonSerializerSettings()); var stack = (FrameStack)deserializer.ReadObject(stream); navigator.ToUrl(stack.Current); foreach (var item in stack.Back) { BackStack.Add(new PageStackEntry(typeof(MainPage), item, null)); } foreach (var item in stack.Forward) { ForwardStack.Add(new PageStackEntry(typeof(MainPage), item, null)); } }
public Frame() { var backStack = new ObservableCollection <PageStackEntry>(); var forwardStack = new ObservableCollection <PageStackEntry>(); backStack.CollectionChanged += (s, e) => { CanGoBack = BackStack.Any(); BackStackDepth = BackStack.Count; }; forwardStack.CollectionChanged += (s, e) => CanGoForward = ForwardStack.Any(); BackStack = backStack; ForwardStack = forwardStack; DefaultStyleKey = typeof(Frame); }
private void HandleContentNavigating(object sender, NavigatingCancelEventArgs e) { if (IsNavigating) { return; } IsNavigating = true; // Choose the name of the transition based on the e.ExtraData that was passed to NavigationService.Navigate(). // If the data is a string, we'll try to find a matching transition by that name. if (e.ExtraData is ResolvedNavigationRequest) { var transitionName = ((ResolvedNavigationRequest)e.ExtraData).RouteValues.GetOrDefault <string>("Transition"); CurrentTransition = transitionRegistry.Get(transitionName); } else if (e.ExtraData is string && transitionRegistry.Get(e.ExtraData.ToString()) != null) { var transitionName = e.ExtraData.ToString(); CurrentTransition = transitionRegistry.Get(transitionName); } else { CurrentTransition = null; } // Keep a record of back/forward navigation and use this to select the reverse transitions. if (e.NavigationMode == NavigationMode.New) { BackStack.Push(CurrentTransition); } else if (e.NavigationMode == NavigationMode.Back) { var original = BackStack.Pop(); ForwardStack.Push(original); var reverseTransition = original == null ? null : transitionRegistry.Get(original.Reverse); CurrentTransition = reverseTransition; } else if (e.NavigationMode == NavigationMode.Forward) { CurrentTransition = ForwardStack.Pop(); BackStack.Push(CurrentTransition); } }
public bool TryGoForward() { if (!CanGoForward) { return(false); } var destination = ForwardStack.LastOrDefault(); if (destination == null) { return(false); } if (!destination.ViewModel.TryGetTarget( out var viewModel)) { return(false); } if (!destination.Content.TryGetTarget( out var content)) { return(false); } ForwardStack.Remove(destination); AddToBackStack( viewModel, content); SetCurrent( viewModel, content); return(true); }
public async Task NavigateAsync(DavItem item) { if (item == null) { return; } if (BackStack.FirstOrDefault(x => x.EntityId == item.EntityId) != null) { var backStackItem = BackStack.FirstOrDefault(x => x.EntityId == item.EntityId); int index = BackStack.IndexOf(backStackItem); var list = BackStack.ToList(); list.RemoveRange(index + 1, BackStack.Count - index - 1); BackStack = list.ToObservableCollection(); ForwardStack.Clear(); CurrentItem = backStackItem; } else { BackStack.Add(item); ForwardStack.Remove(item); CurrentItem = item; } await ReloadAsync(); }
private bool InnerNavigate(PageStackEntry entry, NavigationMode mode) { try { // Navigating var navigatingFromArgs = new NavigatingCancelEventArgs( mode, entry.NavigationTransitionInfo, entry.Parameter, entry.SourcePageType ); Navigating?.Invoke(this, navigatingFromArgs); CurrentEntry?.Instance.OnNavigatingFrom(navigatingFromArgs); if (navigatingFromArgs.Cancel) { NavigationStopped?.Invoke(this, new NavigationEventArgs( entry.Instance, mode, entry.NavigationTransitionInfo, entry.Parameter, entry.SourcePageType, null )); return(false); } // Navigate var previousEntry = CurrentEntry; CurrentEntry = entry; if (mode == NavigationMode.New) { // Doing this first allows CurrentEntry to reuse existing page if pooling is enabled ReleasePages(ForwardStack); } if (CurrentEntry.Instance == null) { var page = CreatePageInstanceCached(entry.SourcePageType); if (page == null) { return(false); } page.Frame = this; CurrentEntry.Instance = page; } Content = CurrentEntry.Instance; switch (mode) { case NavigationMode.New: ForwardStack.Clear(); if (previousEntry != null) { BackStack.Add(previousEntry); } break; case NavigationMode.Back: ForwardStack.Add(previousEntry); BackStack.Remove(CurrentEntry); break; case NavigationMode.Forward: BackStack.Add(previousEntry); ForwardStack.Remove(CurrentEntry); break; case NavigationMode.Refresh: break; } // Navigated var navigationEvent = new NavigationEventArgs( CurrentEntry.Instance, mode, entry.NavigationTransitionInfo, entry.Parameter, entry.SourcePageType, null ); previousEntry?.Instance.OnNavigatedFrom(navigationEvent); CurrentEntry.Instance.OnNavigatedTo(navigationEvent); Navigated?.Invoke(this, navigationEvent); VisualTreeHelper.CloseAllPopups(); return(true); } catch (Exception exception) { NavigationFailed?.Invoke(this, new NavigationFailedEventArgs(entry.SourcePageType, exception)); return(false); } }