This topic provides the complete code sample used in the tutorial Part 2: Manage app lifecycle and state.
This topic contains these sections:
Download location
This sample is not available for download.
Technologies
| Programming languages | C#, Visual Basic .NET |
|---|---|
| Programming models | Windows Runtime |
Requirements
| Minimum supported client | Windows 8 |
|---|---|
| Minimum supported server | Windows Server 2012 |
| Minimum required SDK | Microsoft Visual Studio Express 2012 for Windows 8 |
View the code ()
App.xaml
App.xaml is unchanged from Part 1.
App.xaml.cs/vb
' The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227 ''' <summary> ''' Provides application-specific behavior to supplement the default Application class. ''' </summary> NotInheritable Class App Inherits Application ''' <summary> ''' Invoked when the application is launched normally by the end user. Other entry points ''' will be used when the application is launched to open a specific file, to display ''' search results, and so forth. ''' </summary> ''' <param name="args">Details about the launch request and process.</param> Protected Overrides Async Sub OnLaunched(args As Windows.ApplicationModel.Activation.LaunchActivatedEventArgs) Dim rootFrame As Frame = Window.Current.Content ' Do not repeat app initialization when the Window already has content, ' just ensure that the window is active If rootFrame Is Nothing Then ' Create a Frame to act as the navigation context and navigate to the first page rootFrame = New Frame() HelloWorld.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame") If args.PreviousExecutionState = ApplicationExecutionState.Terminated Then ' TODO: Load state from previously suspended application Await HelloWorld.Common.SuspensionManager.RestoreAsync() End If ' Place the frame in the current Window Window.Current.Content = rootFrame End If If rootFrame.Content Is Nothing Then ' When the navigation stack isn't restored navigate to the first page, ' configuring the new page by passing required information as a navigation ' parameter If Not rootFrame.Navigate(GetType(MainPage), args.Arguments) Then Throw New Exception("Failed to create initial page") End If End If ' Ensure the current window is active Window.Current.Activate() End Sub ''' <summary> ''' Invoked when application execution is being suspended. Application state is saved ''' without knowing whether the application will be terminated or resumed with the contents ''' of memory still intact. ''' </summary> ''' <param name="sender">The source of the suspend request.</param> ''' <param name="e">Details about the suspend request.</param> Private Async Sub OnSuspending(sender As Object, e As SuspendingEventArgs) Handles Me.Suspending Dim deferral As SuspendingDeferral = e.SuspendingOperation.GetDeferral() ' TODO: Save application state and stop any background activity Await HelloWorld.Common.SuspensionManager.SaveAsync() deferral.Complete() End Sub End Class
MainPage.xaml
<common:LayoutAwarePage x:Name="pageRoot" x:Class="HelloWorld.MainPage" DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:HelloWorld" xmlns:common="using:HelloWorld.Common" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Page.Resources> <!-- TODO: Delete this line if the key AppName is declared in App.xaml --> <x:String x:Key="AppName">Hello, world!</x:String> </Page.Resources> <!-- This grid acts as a root panel for the page that defines two rows: * Row 0 contains the back button and page title * Row 1 contains the rest of the page layout --> <Grid Style="{StaticResource LayoutRootStyle}"> <Grid.RowDefinitions> <RowDefinition Height="140"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!-- Back button and page title --> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Button x:Name="backButton" Click="GoBack" IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}" Style="{StaticResource BackButtonStyle}"/> <TextBlock x:Name="pageTitle" Grid.Column="1" Text="{StaticResource AppName}" Style="{StaticResource PageHeaderTextStyle}"/> </Grid> <!-- Controls added in PART 1. --> <StackPanel Grid.Row="1" Margin="120,30,0,0"> <TextBlock Text="What's your name?" Style="{StaticResource BasicTextStyle}"/> <StackPanel Orientation="Horizontal" Margin="0,20,0,20"> <TextBox x:Name="nameInput" Width="300" HorizontalAlignment="Left" TextChanged="NameInput_TextChanged"/> <Button Content="Say "Hello"" Click="Button_Click"/> </StackPanel> <TextBlock x:Name="greetingOutput" Style="{StaticResource BigGreenTextStyle}"/> </StackPanel> <!-- End --> <VisualStateManager.VisualStateGroups> <!-- Visual states reflect the application's view state --> <VisualStateGroup x:Name="ApplicationViewStates"> <VisualState x:Name="FullScreenLandscape"/> <VisualState x:Name="Filled"/> <!-- The entire page respects the narrower 100-pixel margin convention for portrait --> <VisualState x:Name="FullScreenPortrait"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="backButton" Storyboard.TargetProperty="Style"> <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PortraitBackButtonStyle}"/> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <!-- The back button and title have different styles when snapped --> <VisualState x:Name="Snapped"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="backButton" Storyboard.TargetProperty="Style"> <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SnappedBackButtonStyle}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="pageTitle" Storyboard.TargetProperty="Style"> <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SnappedPageHeaderTextStyle}"/> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> </Grid> </common:LayoutAwarePage>
MainPage.xaml.cs/vb
' The Basic Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234237 ''' <summary> ''' A basic page that provides characteristics common to most applications. ''' </summary> Public NotInheritable Class MainPage Inherits Common.LayoutAwarePage ''' <summary> ''' Populates the page with content passed during navigation. Any saved state is also ''' provided when recreating a page from a prior session. ''' </summary> ''' <param name="navigationParameter">The parameter value passed to ''' <see cref="Frame.Navigate"/> when this page was initially requested. ''' </param> ''' <param name="pageState">A dictionary of state preserved by this page during an earlier ''' session. This will be null the first time a page is visited.</param> Protected Overrides Sub LoadState(navigationParameter As Object, pageState As Dictionary(Of String, Object)) ' Restore values stored in session state. If pageState IsNot Nothing AndAlso pageState.ContainsKey("greetingOutputText") Then greetingOutput.Text = pageState("greetingOutputText").ToString() End If ' Restore values stored in app data. Dim roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings If roamingSettings.Values.ContainsKey("userName") Then nameInput.Text = roamingSettings.Values("userName").ToString() End If End Sub ''' <summary> ''' Preserves state associated with this page in case the application is suspended or the ''' page is discarded from the navigation cache. Values must conform to the serialization ''' requirements of <see cref="Common.SuspensionManager.SessionState"/>. ''' </summary> ''' <param name="pageState">An empty dictionary to be populated with serializable state.</param> Protected Overrides Sub SaveState(pageState As Dictionary(Of String, Object)) pageState("greetingOutputText") = greetingOutput.Text ' The user name is already saved, so you don't need to save it here. End Sub Private Sub Button_Click(sender As Object, e As RoutedEventArgs) greetingOutput.Text = "Hello, " & nameInput.Text & "!" End Sub Private Sub NameInput_TextChanged(sender As Object, e As TextChangedEventArgs) Handles nameInput.TextChanged Dim roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings roamingSettings.Values("userName") = nameInput.Text End Sub End Class
Build date: 3/11/2013