WPF C# Tutorial

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="CustomContentStateNavigationSample.StateNavigationPage" 
  xmlns:ns="clr-namespace:CustomContentStateNavigationSample">
  
    
      
      
        
      
    

    Remove Back Entry
    
    
  


//File:Window.xaml.cs
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Collections.Generic;
using System.Text;
namespace CustomContentStateNavigationSample
{
    public partial class StateNavigationPage : Page, IProvideCustomContentState
    {
        void removeBackEntryButton_Click(object sender, RoutedEventArgs e)
        {
            if (this.NavigationService.CanGoBack)
            {
                JournalEntry entry = this.NavigationService.RemoveBackEntry();
                UserCustomContentState state = (UserCustomContentState)entry.CustomContentState;
                this.logListBox.Items.Insert(0, "RemoveBackEntry: " + state.JournalEntryName);
            }
        }
        internal void userListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if( e.RemovedItems.Count == 0 ) return;
            User previousUser = e.RemovedItems[0] as User;
            this.logListBox.Items.Insert(0, "AddBackEntry: " + previousUser.Name);
            UserCustomContentState userPageState = new UserCustomContentState(previousUser);
            this.NavigationService.AddBackEntry(userPageState);
        }
        CustomContentState IProvideCustomContentState.GetContentState()
        {
            User currentUser = this.userListBox.SelectedItem as User;
            this.logListBox.Items.Insert(0, "GetContentState: " + currentUser.Name);
            return new UserCustomContentState(currentUser);
        }
    }
    public class User
    {
        private string name;
        public User() { }
        public User(string name)
        {
            this.name = name;
        }
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
    [Serializable]
    class UserCustomContentState : CustomContentState
    {
        private User user;
        public UserCustomContentState(User user)
        {
            this.user = user;
        }
        public override string JournalEntryName
        {
            get
            {
                return this.user.Name;
            }
        }
        public override void Replay(NavigationService navigationService, NavigationMode mode)
        {
            StateNavigationPage page = (StateNavigationPage)navigationService.Content;
            ListBox userListBox = page.userListBox;
            page.userListBox.SelectionChanged -= page.userListBox_SelectionChanged;
            page.userListBox.SelectedItem = this.user;
            page.userListBox.SelectionChanged += page.userListBox_SelectionChanged;
        }
    }
    public class Users : ObservableCollection
    {
        public Users()
        {
            this.Add(new User("A"));
            this.Add(new User("B"));
            this.Add(new User("C"));
            this.Add(new User("D"));
            this.Add(new User("E"));
            this.Add(new User("F"));
            this.Add(new User("G"));
        }
    }
}