Part 2 Complete code (Windows Store apps using C#/VB and XAML)
[ This article is for Windows 8.x and Windows Phone 8.x developers writing Windows Runtime apps. If you’re developing for Windows 10, see the latest documentation ]
This topic provides the complete code sample used in the tutorial Part 2: Manage app lifecycle and state.
Important This tutorial is intended for use with Microsoft Visual Studio 2013 and Windows 8.1. Parts of it will not work correctly with Microsoft Visual Studio 2012 and Windows 8.
This topic contains these sections:
- Technologies
- Requirements
- View the code (XAML)
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.1 |
Minimum supported server | Windows Server 2012 R2 |
Minimum required SDK | Microsoft Visual Studio Express 2012 for Windows 8 |
View the code (XAML)
App.xaml
App.xaml contains only generated code.
App.xaml.cs/vb
using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
// The Blank Application template is documented at https://go.microsoft.com/fwlink/p/?LinkID=234227
namespace HelloWorld
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
sealed partial class App : Application
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
}
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="e">Details about the launch request and process.</param>
protected async override void OnLaunched(LaunchActivatedEventArgs e)
{
#if DEBUG
if (System.Diagnostics.Debugger.IsAttached)
{
this.DebugSettings.EnableFrameRateCounter = true;
}
#endif
Frame rootFrame = Window.Current.Content as Frame;
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
// 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 (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
await HelloWorld.Common.SuspensionManager.RestoreAsync();
}
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
// 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 (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
// Ensure the current window is active
Window.Current.Activate();
}
/// <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 void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
await HelloWorld.Common.SuspensionManager.SaveAsync();
deferral.Complete();
}
}
}
' The Blank Application template is documented at https://go.microsoft.com/fwlink/p/?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="e">Details about the launch request and process.</param>
Protected Overrides Async Sub OnLaunched(e As Windows.ApplicationModel.Activation.LaunchActivatedEventArgs)
#If DEBUG Then
' Show graphics profiling information while debugging.
If System.Diagnostics.Debugger.IsAttached Then
' Display the current frame rate counters
Me.DebugSettings.EnableFrameRateCounter = True
End If
#End If
Dim rootFrame As Frame = TryCast(Window.Current.Content, Frame)
' 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 e.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), e.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
<Page
x:Name="pageRoot"
x:Class="HelloWorld.MainPage"
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:HelloWorld"
xmlns:common="using:HelloWorld.Common"
xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<common:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
<!-- TODO: Delete this line if the key AppName is declared in App.xaml -->
<x:String x:Key="AppName">Hello, world!</x:String>
<Style x:Key="BigGreenTextStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="Green"/>
<Setter Property="FontSize" Value="36"/>
<Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/>
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
<Setter Property="TextWrapping" Value="Wrap"/>
<Setter Property="Typography.StylisticSet20" Value="True"/>
<Setter Property="Typography.DiscretionaryLigatures" Value="True"/>
<Setter Property="Typography.CaseSensitiveForms" Value="True"/>
<Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
<Setter Property="TextLineBounds" Value="TrimToBaseline"/>
<Setter Property="OpticalMarginAlignment" Value="TrimSideBearings"/>
</Style>
</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 Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Grid.ChildrenTransitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</Grid.ChildrenTransitions>
<Grid.RowDefinitions>
<RowDefinition Height="140"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Back button and page title -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<AppBarButton x:Name="backButton" Icon="Back" Height="95" Margin="10,46,10,0"
Command="{Binding NavigationHelper.GoBackCommand, ElementName=pageRoot}"
Visibility="{Binding IsEnabled, Converter={StaticResource BooleanToVisibilityConverter}, RelativeSource={RelativeSource Mode=Self}}"
AutomationProperties.Name="Back"
AutomationProperties.AutomationId="BackButton"
AutomationProperties.ItemType="Navigation Button"/>
<TextBlock x:Name="pageTitle" Text="{StaticResource AppName}"
Style="{StaticResource HeaderTextBlockStyle}" Grid.Column="1"
IsHitTestVisible="false" TextWrapping="NoWrap" VerticalAlignment="Bottom" Margin="0,0,30,40"/>
</Grid>
<StackPanel Grid.Row="1" Margin="120,30,0,0">
<TextBlock Text="What's your name?" Style="{ThemeResource BaseTextBlockStyle}"/>
<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>
</Grid>
</Page>
MainPage.xaml.cs/vb
using HelloWorld.Common;
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
// The Basic Page item template is documented at https://go.microsoft.com/fwlink/p/?LinkID=234237
namespace HelloWorld
{
/// <summary>
/// A basic page that provides characteristics common to most applications.
/// </summary>
public sealed partial class MainPage : Page
{
private NavigationHelper navigationHelper;
private ObservableDictionary defaultViewModel = new ObservableDictionary();
/// <summary>
/// This can be changed to a strongly typed view model.
/// </summary>
public ObservableDictionary DefaultViewModel
{
get { return this.defaultViewModel; }
}
/// <summary>
/// NavigationHelper is used on each page to aid in navigation and
/// process lifetime management
/// </summary>
public NavigationHelper NavigationHelper
{
get { return this.navigationHelper; }
}
public MainPage()
{
this.InitializeComponent();
this.navigationHelper = new NavigationHelper(this);
this.navigationHelper.LoadState += navigationHelper_LoadState;
this.navigationHelper.SaveState += navigationHelper_SaveState;
}
/// <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(Type, Object)"/> 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>
private void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
// Restore values stored in session state.
if (e.PageState != null && e.PageState.ContainsKey("greetingOutputText"))
{
greetingOutput.Text = e.PageState["greetingOutputText"].ToString();
}
// Restore values stored in app data.
Windows.Storage.ApplicationDataContainer roamingSettings =
Windows.Storage.ApplicationData.Current.RoamingSettings;
if (roamingSettings.Values.ContainsKey("userName"))
{
nameInput.Text = roamingSettings.Values["userName"].ToString();
}
}
/// <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="SuspensionManager.SessionState"/>.
/// </summary>
/// <param name="pageState">An empty dictionary to be populated with serializable state.</param>
private void navigationHelper_SaveState(object sender, SaveStateEventArgs e)
{
e.PageState["greetingOutputText"] = greetingOutput.Text;
}
#region NavigationHelper registration
/// The methods provided in this section are simply used to allow
/// NavigationHelper to respond to the page's navigation methods.
///
/// Page specific logic should be placed in event handlers for the
/// <see cref="GridCS.Common.NavigationHelper.LoadState"/>
/// and <see cref="GridCS.Common.NavigationHelper.SaveState"/>.
/// The navigation parameter is available in the LoadState method
/// in addition to page state preserved during an earlier session.
protected override void OnNavigatedTo(NavigationEventArgs e)
{
navigationHelper.OnNavigatedTo(e);
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
navigationHelper.OnNavigatedFrom(e);
}
#endregion
private void Button_Click(object sender, RoutedEventArgs e)
{
greetingOutput.Text = "Hello, " + nameInput.Text + "!";
}
private void NameInput_TextChanged(object sender, TextChangedEventArgs e)
{
Windows.Storage.ApplicationDataContainer roamingSettings =
Windows.Storage.ApplicationData.Current.RoamingSettings;
roamingSettings.Values["userName"] = nameInput.Text;
}
}
}
' The Basic Page item template is documented at https://go.microsoft.com/fwlink/p/?LinkID=234237
''' <summary>
''' A basic page that provides characteristics common to most applications.
''' </summary>
Public NotInheritable Class MainPage
Inherits Page
''' <summary>
''' NavigationHelper is used on each page to aid in navigation and
''' process lifetime management
''' </summary>
Public ReadOnly Property NavigationHelper As Common.NavigationHelper
Get
Return Me._navigationHelper
End Get
End Property
Private _navigationHelper As Common.NavigationHelper
''' <summary>
''' This can be changed to a strongly typed view model.
''' </summary>
Public ReadOnly Property DefaultViewModel As Common.ObservableDictionary
Get
Return Me._defaultViewModel
End Get
End Property
Private _defaultViewModel As New Common.ObservableDictionary()
Public Sub New()
InitializeComponent()
Me._navigationHelper = New Common.NavigationHelper(Me)
AddHandler Me._navigationHelper.LoadState, AddressOf NavigationHelper_LoadState
AddHandler Me._navigationHelper.SaveState, AddressOf NavigationHelper_SaveState
End Sub
''' <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="sender">
''' The source of the event; typically <see cref="NavigationHelper"/>
''' </param>
''' <param name="e">Event data that provides both the navigation parameter passed to
''' <see cref="Frame.Navigate"/> when this page was initially requested and
''' a dictionary of state preserved by this page during an earlier
''' session. The state will be null the first time a page is visited.</param>
Private Sub NavigationHelper_LoadState(sender As Object, e As Common.LoadStateEventArgs)
' Restore values stored in session state.
If e.PageState IsNot Nothing AndAlso e.PageState.ContainsKey("greetingOutputText") Then
greetingOutput.Text = e.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="sender">
''' The source of the event; typically <see cref="NavigationHelper"/>
''' </param>
''' <param name="e">Event data that provides a dictionary of state preserved by this page
''' during an earlier session. The state will be null the first time a page is visited.</param>
Private Sub NavigationHelper_SaveState(sender As Object, e As Common.SaveStateEventArgs)
e.PageState("greetingOutputText") = greetingOutput.Text
End Sub
#Region "NavigationHelper registration"
''' The methods provided in this section are simply used to allow
''' NavigationHelper to respond to the page's navigation methods.
'''
''' Page specific logic should be placed in event handlers for the
''' <see cref="Common.NavigationHelper.LoadState"/>
''' and <see cref="Common.NavigationHelper.SaveState"/>.
''' The navigation parameter is available in the LoadState method
''' in addition to page state preserved during an earlier session.
Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
_navigationHelper.OnNavigatedTo(e)
End Sub
Protected Overrides Sub OnNavigatedFrom(e As NavigationEventArgs)
_navigationHelper.OnNavigatedFrom(e)
End Sub
#End Region
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