示例#1
0
文件: Frame.cs 项目: mohaider/Uno
 public void GoForward()
 {
     if (CanGoForward)
     {
         InnerNavigate(ForwardStack.Last(), NavigationMode.Forward);
     }
 }
示例#2
0
 public void ClearHistory(int level)
 {
     ForwardStack.Clear();
     while (BackStack.Count > level)
     {
         BackStack.RemoveAt(level);
     }
 }
示例#3
0
        //[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);
        }
示例#7
0
文件: Frame.cs 项目: mohaider/Uno
        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));
            }
        }
示例#10
0
文件: Frame.cs 项目: x86/uno
        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();
 }
示例#14
0
文件: Frame.cs 项目: mohaider/Uno
        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);
            }
        }