Mega Code Archive

 
Categories / C# / WPF
 

Remember and navigate through multiple sets of state for a single page instance

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   x:Class="CustomContentStateNavigationSample.StateNavigationPage"    xmlns:ns="clr-namespace:CustomContentStateNavigationSample">   <DockPanel>     <DockPanel.Resources>       <ObjectDataProvider x:Key="usersDataSource" ObjectType="{x:Type ns:Users}"/>       <DataTemplate x:Key="NameTemplate">         <TextBlock Text="{Binding Path=Name}"/>       </DataTemplate>     </DockPanel.Resources>     <Button Name="removeBackEntryButton" DockPanel.Dock="Top" Click="removeBackEntryButton_Click" Height="25">Remove Back Entry</Button>     <ListBox Name="userListBox" DockPanel.Dock="Top" Height="150" SelectionChanged="userListBox_SelectionChanged" DataContext="{StaticResource usersDataSource}" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource NameTemplate}" />     <ListBox Name="logListBox" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible"></ListBox>   </DockPanel> </Page> //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<User>     {         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"));         }     } }