Remember and navigate through multiple sets of state for a single page instance : Page « Windows Presentation Foundation « VB.Net Tutorial






<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.vb
Imports System
Imports System.Collections.ObjectModel
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Navigation
Imports System.Collections.Generic
Imports System.Text

Namespace CustomContentStateNavigationSample
  Public Partial Class StateNavigationPage
    Inherits Page
    Implements IProvideCustomContentState
    Private Sub removeBackEntryButton_Click(sender As Object, e As RoutedEventArgs)
      If Me.NavigationService.CanGoBack Then
        Dim entry As JournalEntry = Me.NavigationService.RemoveBackEntry()
        Dim state As UserCustomContentState = DirectCast(entry.CustomContentState, UserCustomContentState)
        Me.logListBox.Items.Insert(0, "RemoveBackEntry: " & state.JournalEntryName)
      End If
    End Sub

    Friend Sub userListBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs)
      If e.RemovedItems.Count = 0 Then
        Return
      End If

      Dim previousUser As User = TryCast(e.RemovedItems(0), User)
      Me.logListBox.Items.Insert(0, "AddBackEntry: " & previousUser.Name)

      Dim userPageState As New UserCustomContentState(previousUser)
      Me.NavigationService.AddBackEntry(userPageState)
    End Sub

    Private Function IProvideCustomContentState_GetContentState() As CustomContentState Implements IProvideCustomContentState.GetContentState
      Dim currentUser As User = TryCast(Me.userListBox.SelectedItem, User)
      Me.logListBox.Items.Insert(0, "GetContentState: " & currentUser.Name)
      Return New UserCustomContentState(currentUser)
    End Function
  End Class

  Public Class User
    Private m_name As String
    Public Sub New()
    End Sub
    Public Sub New(name As String)
      Me.m_name = name
    End Sub
    Public Property Name() As String
      Get
        Return m_name
      End Get
      Set
        m_name = value
      End Set
    End Property
  End Class
  <Serializable> _
  Class UserCustomContentState
    Inherits CustomContentState
    Private user As User

    Public Sub New(user As User)
      Me.user = user
    End Sub

    Public Overrides ReadOnly Property JournalEntryName() As String
      Get
        Return Me.user.Name
      End Get
    End Property

    Public Overrides Sub Replay(navigationService As NavigationService, mode As NavigationMode)
      Dim page As StateNavigationPage = DirectCast(navigationService.Content, StateNavigationPage)
      Dim userListBox As ListBox = page.userListBox

      RemoveHandler page.userListBox.SelectionChanged, AddressOf page.userListBox_SelectionChanged
      page.userListBox.SelectedItem = Me.user
      AddHandler page.userListBox.SelectionChanged, AddressOf page.userListBox_SelectionChanged
    End Sub
  End Class

  Public Class Users
    Inherits ObservableCollection(Of User)
    Public Sub New()
      Me.Add(New User("A"))
      Me.Add(New User("B"))
      Me.Add(New User("C"))
      Me.Add(New User("D"))
      Me.Add(New User("E"))
      Me.Add(New User("F"))
      Me.Add(New User("G"))
    End Sub
  End Class
End Namespace
WPF Remember And Navigate Through Multiple Sets Of State For A Single Page Instance








16.56.Page
16.56.1.Automatic InlineUIContainer generation: text along with ButtonAutomatic InlineUIContainer generation: text along with Button
16.56.2.Path Reference Page SnipPath Reference Page Snip
16.56.3.Create a button when the page loads.Create a button when the page loads.
16.56.4.Page Loaded eventPage Loaded event
16.56.5.Remember and navigate through multiple sets of state for a single page instanceRemember and navigate through multiple sets of state for a single page instance
16.56.6.Navigate to an instance of a custom class, instead of a Page.Navigate to an instance of a custom class, instead of a Page.
16.56.7.Select Product Page FunctionSelect Product Page Function
16.56.8.UI With Page for Dynamic Button contentUI With Page for Dynamic Button content
16.56.9.A XAML browser application (XBAP) running in partial trust can safely upload files from a client machine.A XAML browser application (XBAP) running in partial trust can safely upload files from a client machine.