Skip to content

Instantly share code, notes, and snippets.

@karno
Created December 22, 2014 09:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save karno/beb63d3e2233850527c7 to your computer and use it in GitHub Desktop.
Save karno/beb63d3e2233850527c7 to your computer and use it in GitHub Desktop.
Skylight example initialization code
using System;
using System.Threading.Tasks;
using TestApp.Common;
using Skylight.Common;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Animation;
using Windows.UI.Xaml.Navigation;
namespace TestApp
{
/// <summary>
/// TestApp application root
/// </summary>
public sealed partial class App
{
/// <summary>
/// Constructor of the App.<para />
/// Logically equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
this.Suspending += this.OnSuspending;
// register NavigationHelperWrapper factory method
NavigationHelperWrapper.Factory = page =>
{
var helper = new NavigationHelper(page);
var wrapper = new NavigationHelperWrapper();
helper.LoadState += (sender, e) => wrapper.OnLoadState(
new WrappedLoadStateEventArgs(e.NavigationParameter, e.PageState));
helper.SaveState += (sender, e) => wrapper.OnSaveState(
new WrappedSaveStateEventArgs(e.PageState));
return wrapper;
};
}
/// <summary>
/// Application has started by user action.
/// </summary>
/// <param name="e">activation event args</param>
protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
#if DEBUG
if (System.Diagnostics.Debugger.IsAttached)
{
this.DebugSettings.EnableFrameRateCounter = true;
}
#endif
var rootFrame = Window.Current.Content as Frame ??
await this.PrepareRootFrame(e.PreviousExecutionState);
if (rootFrame.Content == null)
{
// remove and restore startup turnstile navigation
// stash current transition animation
TransitionCollection stash = null;
if (rootFrame.ContentTransitions != null)
{
// stash transitions
stash = new TransitionCollection();
foreach (var c in rootFrame.ContentTransitions)
{
stash.Add(c);
}
}
// clear transition animation
rootFrame.ContentTransitions = null;
// restoring transition handler
NavigatedEventHandler firstNavigationHandler = null;
firstNavigationHandler = (sender, ne) =>
{
// restore frame animation
rootFrame.ContentTransitions =
stash ?? new TransitionCollection { new NavigationThemeTransition() };
// remove subscription
rootFrame.Navigated -= firstNavigationHandler;
};
// subscribe navigation handler
rootFrame.Navigated += firstNavigationHandler;
// navigate to first page
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
// "All Application overrides involved in an activation scenario should call Window.Activate in their implementations."
// http://msdn.microsoft.com/ja-jp/library/windows/apps/windows.ui.xaml.application.onlaunched
Window.Current.Activate();
}
/// <summary>
/// Application has started by user action or external interaction.<para />
/// This callback is called by any AndContinue() methods.
/// </summary>
/// <param name="e">activation event args</param>
protected override async void OnActivated(IActivatedEventArgs e)
{
await PrepareRootFrame(e.PreviousExecutionState);
var conargs = e as IContinuationActivatedEventArgs;
if (conargs != null)
{
ContinuationHelper.Continue(conargs);
}
Window.Current.Activate();
}
/// <summary>
/// Prepare app root frame.<para />
/// If root frame is existed, skip processing.
/// </summary>
/// <param name="prevState">previous state args</param>
/// <returns>awaiter task</returns>
private async Task<Frame> PrepareRootFrame(ApplicationExecutionState prevState)
{
var frame = Window.Current.Content as Frame;
if (frame != null)
{
// root frame is already existed
return frame;
}
// create root frame
frame = new Frame
{
// preventing app from China-Font Syndrome.
Language = Windows.Globalization.ApplicationLanguages.Languages[0],
CacheSize = 4, // TODO: set appropriate size
};
// register to SuspensionManager
SuspensionManager.RegisterFrame(frame, "AppFrame");
frame.NavigationFailed += this.OnNavigationFailed;
Window.Current.Content = frame;
if (prevState == ApplicationExecutionState.Terminated)
{
try
{
await SuspensionManager.RestoreAsync();
}
catch (SuspensionManagerException smx)
{
System.Diagnostics.Debug.WriteLine(smx);
// resume failed.
// -> continue to running
}
}
return frame;
}
/// <summary>
/// Navigation has failed.
/// </summary>
/// <param name="sender">sender object</param>
/// <param name="e">navigation failed description</param>
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load specified page: " + e.SourcePageType.FullName,
e.Exception);
}
/// <summary>
/// Callback for suspending apps.
/// </summary>
/// <param name="sender">sender object</param>
/// <param name="e">suspend description</param>
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
// Save previous state
await SuspensionManager.SaveAsync();
deferral.Complete();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment