OSDN Git Service

最初のコミット
authorsfpgmr <sfpg@users.sourceforge.jp>
Mon, 16 Apr 2012 21:44:46 +0000 (06:44 +0900)
committersfpgmr <sfpg@users.sourceforge.jp>
Mon, 16 Apr 2012 21:44:46 +0000 (06:44 +0900)
28 files changed:
.gitignore [new file with mode: 0644]
ShootingGame.sln [new file with mode: 0644]
ShootingGame/App.xaml [new file with mode: 0644]
ShootingGame/App.xaml.cpp [new file with mode: 0644]
ShootingGame/App.xaml.h [new file with mode: 0644]
ShootingGame/Assets/Logo.png [new file with mode: 0644]
ShootingGame/Assets/SmallLogo.png [new file with mode: 0644]
ShootingGame/Assets/SplashScreen.png [new file with mode: 0644]
ShootingGame/Assets/StoreLogo.png [new file with mode: 0644]
ShootingGame/BlankPage.xaml [new file with mode: 0644]
ShootingGame/BlankPage.xaml.cpp [new file with mode: 0644]
ShootingGame/BlankPage.xaml.h [new file with mode: 0644]
ShootingGame/Common/BindableBase.cpp [new file with mode: 0644]
ShootingGame/Common/BindableBase.h [new file with mode: 0644]
ShootingGame/Common/BooleanNegationConverter.cpp [new file with mode: 0644]
ShootingGame/Common/BooleanNegationConverter.h [new file with mode: 0644]
ShootingGame/Common/BooleanToVisibilityConverter.cpp [new file with mode: 0644]
ShootingGame/Common/BooleanToVisibilityConverter.h [new file with mode: 0644]
ShootingGame/Common/LayoutAwarePage.cpp [new file with mode: 0644]
ShootingGame/Common/LayoutAwarePage.h [new file with mode: 0644]
ShootingGame/Common/ReadMe.txt [new file with mode: 0644]
ShootingGame/Common/RichTextColumns.cpp [new file with mode: 0644]
ShootingGame/Common/RichTextColumns.h [new file with mode: 0644]
ShootingGame/Common/StandardStyles.xaml [new file with mode: 0644]
ShootingGame/Package.appxmanifest [new file with mode: 0644]
ShootingGame/ShootingGame.vcxproj [new file with mode: 0644]
ShootingGame/pch.cpp [new file with mode: 0644]
ShootingGame/pch.h [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..dd57445
--- /dev/null
@@ -0,0 +1,14 @@
+_UpgradeReport_Files/
+*.vcxproj.*
+*.old
+*.xml
+*.sdf
+*.suo
+*.dsp
+*.dsw
+*.vcproj
+*.pfx
+unix/
+Debug/
+Release/
+ipch/
\ No newline at end of file
diff --git a/ShootingGame.sln b/ShootingGame.sln
new file mode 100644 (file)
index 0000000..da081e4
--- /dev/null
@@ -0,0 +1,38 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 11 Express for Windows 8
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShootingGame", "ShootingGame\ShootingGame.vcxproj", "{22AB165E-4668-4790-B3D6-C76A3DB0D887}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|ARM = Debug|ARM
+               Debug|Win32 = Debug|Win32
+               Debug|x64 = Debug|x64
+               Release|ARM = Release|ARM
+               Release|Win32 = Release|Win32
+               Release|x64 = Release|x64
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Debug|ARM.ActiveCfg = Debug|ARM
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Debug|ARM.Build.0 = Debug|ARM
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Debug|ARM.Deploy.0 = Debug|ARM
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Debug|Win32.ActiveCfg = Debug|Win32
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Debug|Win32.Build.0 = Debug|Win32
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Debug|Win32.Deploy.0 = Debug|Win32
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Debug|x64.ActiveCfg = Debug|x64
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Debug|x64.Build.0 = Debug|x64
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Debug|x64.Deploy.0 = Debug|x64
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Release|ARM.ActiveCfg = Release|ARM
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Release|ARM.Build.0 = Release|ARM
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Release|ARM.Deploy.0 = Release|ARM
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Release|Win32.ActiveCfg = Release|Win32
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Release|Win32.Build.0 = Release|Win32
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Release|Win32.Deploy.0 = Release|Win32
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Release|x64.ActiveCfg = Release|x64
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Release|x64.Build.0 = Release|x64
+               {22AB165E-4668-4790-B3D6-C76A3DB0D887}.Release|x64.Deploy.0 = Release|x64
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/ShootingGame/App.xaml b/ShootingGame/App.xaml
new file mode 100644 (file)
index 0000000..bdf5cae
--- /dev/null
@@ -0,0 +1,20 @@
+<Application
+    x:Class="ShootingGame.App"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:local="using:ShootingGame">
+
+    <Application.Resources>
+        <ResourceDictionary>
+            <ResourceDictionary.MergedDictionaries>
+
+                <!-- 
+                    Styles that define common aspects of the platform look and feel
+                    Required by Visual Studio project and item templates
+                 -->
+                <ResourceDictionary Source="Common/StandardStyles.xaml"/>
+            </ResourceDictionary.MergedDictionaries>
+
+        </ResourceDictionary>
+    </Application.Resources>
+</Application>
diff --git a/ShootingGame/App.xaml.cpp b/ShootingGame/App.xaml.cpp
new file mode 100644 (file)
index 0000000..956c271
--- /dev/null
@@ -0,0 +1,70 @@
+//
+// App.xaml.cpp
+// App.xaml クラスの実装。
+//
+
+#include "pch.h"
+#include "BlankPage.xaml.h"
+
+using namespace ShootingGame;
+
+using namespace Platform;
+using namespace Windows::ApplicationModel;
+using namespace Windows::ApplicationModel::Activation;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls;
+using namespace Windows::UI::Xaml::Controls::Primitives;
+using namespace Windows::UI::Xaml::Data;
+using namespace Windows::UI::Xaml::Input;
+using namespace Windows::UI::Xaml::Interop;
+using namespace Windows::UI::Xaml::Media;
+using namespace Windows::UI::Xaml::Navigation;
+
+// The Split Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234228
+
+/// <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>
+App::App()
+{
+       InitializeComponent();
+       Suspending += ref new SuspendingEventHandler(this, &App::OnSuspending);
+}
+
+/// <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>
+void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ pArgs)
+{
+       if (pArgs->PreviousExecutionState == ApplicationExecutionState::Terminated)
+       {
+               //TODO: Load state from previously suspended application
+       }
+
+       // Create a Frame to act navigation context and navigate to the first page
+       auto rootFrame = ref new Frame();
+       TypeName pageType = { BlankPage::typeid->FullName, TypeKind::Metadata };
+       rootFrame->Navigate(pageType);
+
+       // Place the frame in the current Window and ensure that it is active
+       Window::Current->Content = rootFrame;
+       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>
+void App::OnSuspending(Object^ sender, SuspendingEventArgs^ e)
+{
+       //TODO: Save application state and stop any background activity
+}
diff --git a/ShootingGame/App.xaml.h b/ShootingGame/App.xaml.h
new file mode 100644 (file)
index 0000000..b2857c9
--- /dev/null
@@ -0,0 +1,25 @@
+//
+// App.xaml.h
+// App.xaml クラスの宣言。
+//
+
+#pragma once
+
+#include "pch.h"
+#include "App.g.h"
+
+namespace ShootingGame
+{
+       /// <summary>
+       /// Provides application-specific behavior to supplement the default Application class.
+       /// </summary>
+       ref class App sealed
+       {
+       public:
+               App();
+               virtual void OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ pArgs) override;
+
+       private:
+               void OnSuspending(Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ e);
+       };
+}
diff --git a/ShootingGame/Assets/Logo.png b/ShootingGame/Assets/Logo.png
new file mode 100644 (file)
index 0000000..ebd735a
Binary files /dev/null and b/ShootingGame/Assets/Logo.png differ
diff --git a/ShootingGame/Assets/SmallLogo.png b/ShootingGame/Assets/SmallLogo.png
new file mode 100644 (file)
index 0000000..92dd105
Binary files /dev/null and b/ShootingGame/Assets/SmallLogo.png differ
diff --git a/ShootingGame/Assets/SplashScreen.png b/ShootingGame/Assets/SplashScreen.png
new file mode 100644 (file)
index 0000000..193187f
Binary files /dev/null and b/ShootingGame/Assets/SplashScreen.png differ
diff --git a/ShootingGame/Assets/StoreLogo.png b/ShootingGame/Assets/StoreLogo.png
new file mode 100644 (file)
index 0000000..3765186
Binary files /dev/null and b/ShootingGame/Assets/StoreLogo.png differ
diff --git a/ShootingGame/BlankPage.xaml b/ShootingGame/BlankPage.xaml
new file mode 100644 (file)
index 0000000..6c7866b
--- /dev/null
@@ -0,0 +1,13 @@
+<Page
+    x:Class="ShootingGame.BlankPage"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:local="using:ShootingGame"
+    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+    mc:Ignorable="d">
+
+    <Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
+
+    </Grid>
+</Page>
diff --git a/ShootingGame/BlankPage.xaml.cpp b/ShootingGame/BlankPage.xaml.cpp
new file mode 100644 (file)
index 0000000..136e5fd
--- /dev/null
@@ -0,0 +1,36 @@
+//
+//BlankPage.xaml.cpp
+//BlankPage.xaml クラスの実装。
+//
+
+#include "pch.h"
+#include "BlankPage.xaml.h"
+
+using namespace ShootingGame;
+
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls;
+using namespace Windows::UI::Xaml::Controls::Primitives;
+using namespace Windows::UI::Xaml::Data;
+using namespace Windows::UI::Xaml::Input;
+using namespace Windows::UI::Xaml::Media;
+using namespace Windows::UI::Xaml::Navigation;
+
+// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
+
+BlankPage::BlankPage()
+{
+       InitializeComponent();
+}
+
+/// <summary>
+/// Invoked when this page is about to be displayed in a Frame.
+/// </summary>
+/// <param name="e">Event data that describes how this page was reached.  The Parameter
+/// property is typically used to configure the page.</param>
+void BlankPage::OnNavigatedTo(NavigationEventArgs^ e)
+{
+}
diff --git a/ShootingGame/BlankPage.xaml.h b/ShootingGame/BlankPage.xaml.h
new file mode 100644 (file)
index 0000000..ad6665f
--- /dev/null
@@ -0,0 +1,24 @@
+//
+//BlankPage.xaml.h
+//BlankPage.xaml クラスの宣言。
+//
+
+#pragma once
+
+#include "pch.h"
+#include "BlankPage.g.h"
+
+namespace ShootingGame
+{
+       /// <summary>
+       /// An empty page that can be used on its own or navigated to within a Frame.
+       /// </summary>
+       public ref class BlankPage sealed
+       {
+       public:
+               BlankPage();
+
+       protected:
+               virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override;
+       };
+}
diff --git a/ShootingGame/Common/BindableBase.cpp b/ShootingGame/Common/BindableBase.cpp
new file mode 100644 (file)
index 0000000..97529a0
--- /dev/null
@@ -0,0 +1,16 @@
+#include "pch.h"
+#include "BindableBase.h"
+
+using namespace ShootingGame::Common;
+
+using namespace Platform;
+using namespace Windows::UI::Xaml::Data;
+
+/// <summary>
+/// Notifies listeners that a property value has changed.
+/// </summary>
+/// <param name="propertyName">Name of the property used to notify listeners.</param>
+void BindableBase::OnPropertyChanged(String^ propertyName)
+{
+       PropertyChanged(this, ref new PropertyChangedEventArgs(propertyName));
+}
diff --git a/ShootingGame/Common/BindableBase.h b/ShootingGame/Common/BindableBase.h
new file mode 100644 (file)
index 0000000..fbc5755
--- /dev/null
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "pch.h"
+
+namespace ShootingGame
+{
+       namespace Common
+       {
+               // Suppress class "not consumable from JavaScript because it's not marked 'sealed'" warning
+               // currently emitted despite the WebHostHidden attribute
+               #pragma warning(push)
+               #pragma warning(disable: 4449)
+               /// <summary>
+               /// Implementation of <see cref="INotifyPropertyChanged"/> to simplify models.
+               /// </summary>
+               [Windows::Foundation::Metadata::WebHostHidden]
+               public ref class BindableBase : Windows::UI::Xaml::Data::INotifyPropertyChanged
+               {
+               public:
+                       event Windows::UI::Xaml::Data::PropertyChangedEventHandler^ PropertyChanged;
+
+               protected:
+                       void OnPropertyChanged(Platform::String^ propertyName);
+               };
+               #pragma warning(pop)
+       }
+}
diff --git a/ShootingGame/Common/BooleanNegationConverter.cpp b/ShootingGame/Common/BooleanNegationConverter.cpp
new file mode 100644 (file)
index 0000000..a6515e2
--- /dev/null
@@ -0,0 +1,22 @@
+#include "pch.h"
+#include "BooleanNegationConverter.h"
+
+using namespace ShootingGame::Common;
+
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::UI::Xaml::Interop;
+
+Object^ BooleanNegationConverter::Convert(Object^ value, TypeName targetType, Object^ parameter, String^)
+{
+       auto boxedBool = dynamic_cast<Box<bool>^>(value);
+       auto boolValue = (boxedBool != nullptr && boxedBool->Value);
+       return !boolValue;
+}
+
+Object^ BooleanNegationConverter::ConvertBack(Object^ value, TypeName targetType, Object^ parameter, String^)
+{
+       auto boxedBool = dynamic_cast<Box<bool>^>(value);
+       auto boolValue = (boxedBool != nullptr && boxedBool->Value);
+       return !boolValue;
+}
diff --git a/ShootingGame/Common/BooleanNegationConverter.h b/ShootingGame/Common/BooleanNegationConverter.h
new file mode 100644 (file)
index 0000000..d1c7dff
--- /dev/null
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "pch.h"
+
+namespace ShootingGame
+{
+       namespace Common
+       {
+               /// <summary>
+               /// Value converter that translates true to false and vice versa.
+               /// </summary>
+               public ref class BooleanNegationConverter sealed : Windows::UI::Xaml::Data::IValueConverter
+               {
+               public:
+                       virtual Object^ Convert(Object^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object^ parameter, Platform::String^);
+                       virtual Object^ ConvertBack(Object^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object^ parameter, Platform::String^);
+               };
+       }
+}
diff --git a/ShootingGame/Common/BooleanToVisibilityConverter.cpp b/ShootingGame/Common/BooleanToVisibilityConverter.cpp
new file mode 100644 (file)
index 0000000..8219a76
--- /dev/null
@@ -0,0 +1,22 @@
+#include "pch.h"
+#include "BooleanToVisibilityConverter.h"
+
+using namespace ShootingGame::Common;
+
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Interop;
+
+Object^ BooleanToVisibilityConverter::Convert(Object^ value, TypeName targetType, Object^ parameter, String^)
+{
+       auto boxedBool = dynamic_cast<Box<bool>^>(value);
+       auto boolValue = (boxedBool != nullptr && boxedBool->Value);
+       return (boolValue ? Visibility::Visible : Visibility::Collapsed);
+}
+
+Object^ BooleanToVisibilityConverter::ConvertBack(Object^ value, TypeName targetType, Object^ parameter, String^)
+{
+       auto visibility = dynamic_cast<Box<Visibility>^>(value);
+       return (visibility != nullptr && visibility->Value == Visibility::Visible);
+}
diff --git a/ShootingGame/Common/BooleanToVisibilityConverter.h b/ShootingGame/Common/BooleanToVisibilityConverter.h
new file mode 100644 (file)
index 0000000..41ffe99
--- /dev/null
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "pch.h"
+
+namespace ShootingGame
+{
+       namespace Common
+       {
+               /// <summary>
+               /// Value converter that translates true to <see cref="Visibility.Visible"/> and false
+               /// to <see cref="Visibility.Collapsed"/>.
+               /// </summary>
+               public ref class BooleanToVisibilityConverter sealed : Windows::UI::Xaml::Data::IValueConverter
+               {
+               public:
+                       virtual Object^ Convert(Object^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object^ parameter, Platform::String^);
+                       virtual Object^ ConvertBack(Object^ value, Windows::UI::Xaml::Interop::TypeName targetType, Object^ parameter, Platform::String^);
+               };
+       }
+}
diff --git a/ShootingGame/Common/LayoutAwarePage.cpp b/ShootingGame/Common/LayoutAwarePage.cpp
new file mode 100644 (file)
index 0000000..697ea58
--- /dev/null
@@ -0,0 +1,236 @@
+#include "pch.h"
+#include "LayoutAwarePage.h"
+
+using namespace ShootingGame::Common;
+
+using namespace Platform;
+using namespace Platform::Collections;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::UI::ViewManagement;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls;
+
+/// <summary>
+/// Initializes a new instance of the <see cref="LayoutAwarePage"/> class.
+/// </summary>
+LayoutAwarePage::LayoutAwarePage()
+{
+       if (Windows::ApplicationModel::DesignMode::DesignModeEnabled) return;
+
+       // Map application view state to visual state for this page when it is part of the visual tree
+       Loaded += ref new RoutedEventHandler(this, &LayoutAwarePage::StartLayoutUpdates);
+       Unloaded += ref new RoutedEventHandler(this, &LayoutAwarePage::StopLayoutUpdates);
+
+       // Establish the default view model as the initial DataContext
+       DataContext = _defaultViewModel = ref new Map<String^, Object^>(std::less<String^>());
+}
+
+/// <summary>
+/// Gets an implementation of <see cref="IObservableMap<String, Object>"/> set as the page's
+/// default <see cref="DataContext"/>.  This instance can be bound and surfaces property change
+/// notifications making it suitable for use as a trivial view model.
+/// </summary>
+IObservableMap<Platform::String^, Object^>^ LayoutAwarePage::DefaultViewModel::get()
+{
+       return _defaultViewModel;
+}
+
+/// <summary>
+/// Gets a value indicating whether visual states can be a loose interpretation of the actual
+/// application view state.  This is often convenient when a page layout is space constrained.
+/// </summary>
+/// <remarks>
+/// The default value of false indicates that the visual state is identical to the view state,
+/// meaning that Filled is only used when another application is snapped.  When set to true
+/// FullScreenLandscape is used to indicate that at least 1366 virtual pixels of horizontal real
+/// estate are available - even if another application is snapped - and Filled indicates a lesser
+/// width, even if no other application is snapped.  On a smaller display such as a 1024x768
+/// panel this will result in the visual state Filled whenever the device is in landscape
+/// orientation.
+/// </remarks>
+bool LayoutAwarePage::UseFilledStateForNarrowWindow::get()
+{
+       return _useFilledStateForNarrowWindow;
+}
+
+/// <summary>
+/// Sets a value indicating whether visual states can be a loose interpretation of the actual
+/// application view state.  This is often convenient when a page layout is space constrained.
+/// </summary>
+/// <remarks>
+/// The default value of false indicates that the visual state is identical to the view state,
+/// meaning that Filled is only used when another application is snapped.  When set to true
+/// FullScreenLandscape is used to indicate that at least 1366 virtual pixels of horizontal real
+/// estate are available - even if another application is snapped - and Filled indicates a lesser
+/// width, even if no other application is snapped.  On a smaller display such as a 1024x768
+/// panel this will result in the visual state Filled whenever the device is in landscape
+/// orientation.
+/// </remarks>
+void LayoutAwarePage::UseFilledStateForNarrowWindow::set(bool value)
+{
+       _useFilledStateForNarrowWindow = value;
+       this->InvalidateVisualState();
+}
+
+/// <summary>
+/// Invoked as an event handler to navigate backward in the page's associated <see cref="Frame"/>
+/// until it reaches the top of the navigation stack.
+/// </summary>
+/// <param name="sender">Instance that triggered the event.</param>
+/// <param name="e">Event data describing the conditions that led to the event.</param>
+void LayoutAwarePage::GoHome(Object^ sender, RoutedEventArgs^ e)
+{
+       // Use the navigation frame to return to the topmost page
+       if (Frame != nullptr)
+       {
+               while (Frame->CanGoBack) Frame->GoBack();
+       }
+}
+
+/// <summary>
+/// Invoked as an event handler to navigate backward in the page's associated <see cref="Frame"/>
+/// to go back one step on the navigation stack.
+/// </summary>
+/// <param name="sender">Instance that triggered the event.</param>
+/// <param name="e">Event data describing the conditions that led to the event.</param>
+void LayoutAwarePage::GoBack(Object^ sender, RoutedEventArgs^ e)
+{
+       // Use the navigation frame to return to the previous page
+       if (Frame != nullptr && Frame->CanGoBack) Frame->GoBack();
+}
+
+/// <summary>
+/// Invoked as an event handler, typically on the <see cref="Loaded"/> event of a
+/// <see cref="Control"/> within the page, to indicate that the sender should start receiving
+/// visual state management changes that correspond to application view state changes.
+/// </summary>
+/// <param name="sender">Instance of <see cref="Control"/> that supports visual state management
+/// corresponding to view states.</param>
+/// <param name="e">Event data that describes how the request was made.</param>
+/// <remarks>The current view state will immediately be used to set the corresponding visual state
+/// when layout updates are requested.  A corresponding <see cref="Unloaded"/> event handler
+/// connected to <see cref="StopLayoutUpdates"/> is strongly encouraged.  Instances of
+/// <see cref="LayoutAwarePage"/> automatically invoke these handlers in their Loaded and Unloaded
+/// events.</remarks>
+/// <seealso cref="DetermineVisualState"/>
+/// <seealso cref="InvalidateVisualState"/>
+void LayoutAwarePage::StartLayoutUpdates(Object^ sender, RoutedEventArgs^ e)
+{
+       auto control = safe_cast<Control^>(sender);
+       if (_layoutAwareControls == nullptr) {
+               // Start listening to view state changes when there are controls interested in updates
+               _layoutAwareControls = ref new Vector<Control^>();
+               _viewStateEventToken = ApplicationView::GetForCurrentView()->ViewStateChanged += ref new TypedEventHandler<ApplicationView^,ApplicationViewStateChangedEventArgs^>(this, &LayoutAwarePage::ViewStateChanged);
+               _windowSizeEventToken = Window::Current->SizeChanged += ref new WindowSizeChangedEventHandler(this, &LayoutAwarePage::WindowSizeChanged);
+       }
+       _layoutAwareControls->Append(control);
+
+       // Set the initial visual state of the control
+       VisualStateManager::GoToState(control, DetermineVisualState(ApplicationView::Value), false);
+}
+
+void LayoutAwarePage::ViewStateChanged(ApplicationView^ sender, ApplicationViewStateChangedEventArgs^ e)
+{
+       InvalidateVisualState(e->ViewState);
+}
+
+void LayoutAwarePage::WindowSizeChanged(Object^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ e)
+{
+       if (_useFilledStateForNarrowWindow) InvalidateVisualState();
+}
+
+/// <summary>
+/// Invoked as an event handler, typically on the <see cref="Unloaded"/> event of a
+/// <see cref="Control"/>, to indicate that the sender should start receiving visual state
+/// management changes that correspond to application view state changes.
+/// </summary>
+/// <param name="sender">Instance of <see cref="Control"/> that supports visual state management
+/// corresponding to view states.</param>
+/// <param name="e">Event data that describes how the request was made.</param>
+/// <remarks>The current view state will immediately be used to set the corresponding visual state
+/// when layout updates are requested.</remarks>
+/// <seealso cref="StartLayoutUpdates"/>
+void LayoutAwarePage::StopLayoutUpdates(Object^ sender, RoutedEventArgs^ e)
+{
+       auto control = safe_cast<Control^>(sender);
+       unsigned int index;
+       if (_layoutAwareControls != nullptr && _layoutAwareControls->IndexOf(control, &index))
+       {
+               _layoutAwareControls->RemoveAt(index);
+               if (_layoutAwareControls->Size == 0)
+               {
+                       // Stop listening to view state changes when no controls are interested in updates
+                       ApplicationView::GetForCurrentView()->ViewStateChanged -= _viewStateEventToken;
+                       Window::Current->SizeChanged -= _windowSizeEventToken;
+                       _layoutAwareControls = nullptr;
+               }
+       }
+}
+
+/// <summary>
+/// Translates <see cref="ApplicationViewState"/> values into strings for visual state management
+/// within the page.  The default implementation uses the names of enum values.  Subclasses may
+/// override this method to control the mapping scheme used.
+/// </summary>
+/// <param name="viewState">View state for which a visual state is desired.</param>
+/// <returns>Visual state name used to drive the <see cref="VisualStateManager"/></returns>
+/// <seealso cref="InvalidateVisualState"/>
+Platform::String^ LayoutAwarePage::DetermineVisualState(ApplicationViewState viewState)
+{
+       auto actualViewState = viewState;
+       if (_useFilledStateForNarrowWindow &&
+               (viewState == ApplicationViewState::Filled ||
+               viewState == ApplicationViewState::FullScreenLandscape))
+       {
+               // Allow pages to request that the Filled state be used only for landscape layouts narrower
+               // than 1366 virtual pixels
+               auto windowWidth = Window::Current->Bounds.Width;
+               actualViewState = windowWidth >= 1366 ? ApplicationViewState::FullScreenLandscape : ApplicationViewState::Filled;
+       }
+       switch (actualViewState)
+       {
+       case ApplicationViewState::Filled: return "Filled";
+       case ApplicationViewState::Snapped: return "Snapped";
+       case ApplicationViewState::FullScreenPortrait: return "FullScreenPortrait";
+       default: case ApplicationViewState::FullScreenLandscape: return "FullScreenLandscape";
+       }
+}
+
+/// <summary>
+/// Updates all controls that are listening for visual state changes with the correct visual
+/// state.
+/// </summary>
+/// <remarks>
+/// Typically used in conjunction with overriding <see cref="DetermineVisualState"/> to
+/// signal that a different value may be returned even though the view state has not changed.
+/// </remarks>
+void LayoutAwarePage::InvalidateVisualState()
+{
+       InvalidateVisualState(ApplicationView::Value);
+}
+
+/// <summary>
+/// Updates all controls that are listening for visual state changes with the correct visual
+/// state.
+/// </summary>
+/// <remarks>
+/// Typically used in conjunction with overriding <see cref="DetermineVisualState"/> to
+/// signal that a different value may be returned even though the view state has not changed.
+/// </remarks>
+/// <param name="viewState">The desired view state, or null if the current view state should be
+/// used.</param>
+void LayoutAwarePage::InvalidateVisualState(ApplicationViewState viewState)
+{
+       if (_layoutAwareControls != nullptr)
+       {
+               String^ visualState = DetermineVisualState(viewState);
+               auto controlIterator = _layoutAwareControls->First();
+               while (controlIterator->HasCurrent)
+               {
+                       auto control = controlIterator->Current;
+                       VisualStateManager::GoToState(control, visualState, false);
+                       controlIterator->MoveNext();
+               }
+       }
+}
diff --git a/ShootingGame/Common/LayoutAwarePage.h b/ShootingGame/Common/LayoutAwarePage.h
new file mode 100644 (file)
index 0000000..fc89c89
--- /dev/null
@@ -0,0 +1,54 @@
+#pragma once
+
+#include "pch.h"
+#include <collection.h>
+
+namespace ShootingGame
+{
+       namespace Common
+       {
+               // Suppress class "not consumable from JavaScript because it's not marked 'sealed'" warning
+               // currently emitted despite the WebHostHidden attribute
+               #pragma warning(push)
+               #pragma warning(disable: 4449)
+               /// <summary>
+               /// Typical implementation of Page that provides several important conveniences: application
+               /// view state to visual state mapping, GoBack and GoHome event handlers, and a default view
+               /// model.
+               /// </summary>
+               [Windows::Foundation::Metadata::WebHostHidden]
+               public ref class LayoutAwarePage : Windows::UI::Xaml::Controls::Page
+               {
+               public:
+                       LayoutAwarePage();
+                       void StartLayoutUpdates(Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+                       void StopLayoutUpdates(Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+                       void InvalidateVisualState();
+                       void InvalidateVisualState(Windows::UI::ViewManagement::ApplicationViewState viewState);
+                       property bool UseFilledStateForNarrowWindow
+                       {
+                               bool get();
+                               void set(bool value);
+                       }
+                       property Windows::Foundation::Collections::IObservableMap<Platform::String^, Object^>^ DefaultViewModel
+                       {
+                               Windows::Foundation::Collections::IObservableMap<Platform::String^, Object^>^ get();
+                       }
+
+               protected:
+                       virtual void GoHome(Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+                       virtual void GoBack(Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
+                       virtual Platform::String^ DetermineVisualState(Windows::UI::ViewManagement::ApplicationViewState viewState);
+
+               private:
+                       bool _useFilledStateForNarrowWindow;
+                       Platform::Collections::Map<Platform::String^, Object^>^ _defaultViewModel;
+                       Windows::Foundation::EventRegistrationToken _viewStateEventToken;
+                       Windows::Foundation::EventRegistrationToken _windowSizeEventToken;
+                       Platform::Collections::Vector<Windows::UI::Xaml::Controls::Control^>^ _layoutAwareControls;
+                       void ViewStateChanged(Windows::UI::ViewManagement::ApplicationView^ sender, Windows::UI::ViewManagement::ApplicationViewStateChangedEventArgs^ e);
+                       void WindowSizeChanged(Object^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ e);
+               };
+               #pragma warning(pop)
+       }
+}
diff --git a/ShootingGame/Common/ReadMe.txt b/ShootingGame/Common/ReadMe.txt
new file mode 100644 (file)
index 0000000..ec0f038
--- /dev/null
@@ -0,0 +1,7 @@
+The Common directory contains classes and XAML styles that simplify application development.
+
+These are not merely convenient, but are required by most Visual Studio project and item templates.
+Removing, renaming, or otherwise modifying the content of these files may result in a project that
+does not build, or that will not build once additional pages are added.  If variations on these
+classes or styles are desired it is recommended that you copy the content under a new name and
+modify your private copy.
diff --git a/ShootingGame/Common/RichTextColumns.cpp b/ShootingGame/Common/RichTextColumns.cpp
new file mode 100644 (file)
index 0000000..3ddb14a
--- /dev/null
@@ -0,0 +1,190 @@
+#include "pch.h"
+#include "RichTextColumns.h"
+
+using namespace ShootingGame::Common;
+
+using namespace Platform;
+using namespace Platform::Collections;
+using namespace Windows::Foundation;
+using namespace Windows::UI::Xaml;
+using namespace Windows::UI::Xaml::Controls;
+using namespace Windows::UI::Xaml::Interop;
+
+static Windows::UI::Xaml::DependencyProperty^ _richTextContentProperty;
+static Windows::UI::Xaml::DependencyProperty^ _columnTemplateProperty;
+
+/// <summary>
+/// Initializes a new instance of the <see cref="RichTextColumns"/> class.
+/// </summary>
+RichTextColumns::RichTextColumns()
+{
+       HorizontalAlignment = ::HorizontalAlignment::Left;
+}
+
+/// <summary>
+/// Gets the initial rich text content to be used as the first column.
+/// </summary>
+DependencyProperty^ RichTextColumns::ColumnTemplateProperty::get()
+{
+       if (_columnTemplateProperty == nullptr)
+       {
+               TypeName thisType = { RichTextColumns::typeid->FullName, TypeKind::Custom };
+               TypeName dataTemplateType = { DataTemplate::typeid->FullName, TypeKind::Metadata };
+               _columnTemplateProperty = DependencyProperty::Register("ColumnTemplate",
+                       dataTemplateType, thisType, ref new PropertyMetadata(nullptr,
+                       ref new PropertyChangedCallback(&RichTextColumns::ResetOverflowLayout)));
+       }
+       return _columnTemplateProperty;
+}
+
+/// <summary>
+/// Gets the template used to create additional
+/// <see cref="RichTextBlockOverflow"/> instances.
+/// </summary>
+DependencyProperty^ RichTextColumns::RichTextContentProperty::get()
+{
+       if (_richTextContentProperty == nullptr)
+       {
+               TypeName thisType = { RichTextColumns::typeid->FullName, TypeKind::Custom };
+               TypeName richTextBlockType = { RichTextBlock::typeid->FullName, TypeKind::Metadata };
+               _richTextContentProperty = DependencyProperty::Register("RichTextContent",
+                       richTextBlockType, thisType, ref new PropertyMetadata(nullptr,
+                       ref new PropertyChangedCallback(&RichTextColumns::ResetOverflowLayout)));
+       }
+       return _richTextContentProperty;
+}
+
+/// <summary>
+/// Invoked when the content or overflow template is changed to recreate the column layout.
+/// </summary>
+/// <param name="d">Instance of <see cref="RichTextColumns"/> where the change
+/// occurred.</param>
+/// <param name="e">Event data describing the specific change.</param>
+void RichTextColumns::ResetOverflowLayout(DependencyObject^ d, DependencyPropertyChangedEventArgs^ e)
+{
+       auto target = dynamic_cast<RichTextColumns^>(d);
+       if (target != nullptr)
+       {
+               // When dramatic changes occur, rebuild layout from scratch
+               target->_overflowColumns = nullptr;
+               target->Children->Clear();
+               target->InvalidateMeasure();
+       }
+}
+
+/// <summary>
+/// Determines whether additional overflow columns are needed and if existing columns can
+/// be removed.
+/// </summary>
+/// <param name="availableSize">The size of the space available, used to constrain the
+/// number of additional columns that can be created.</param>
+/// <returns>The resulting size of the original content plus any extra columns.</returns>
+Size RichTextColumns::MeasureOverride(Size availableSize)
+{
+       if (RichTextContent == nullptr)
+       {
+               Size emptySize(0, 0);
+               return emptySize;
+       }
+
+       // Make sure the RichTextBlock is a child, using the lack of
+       // a list of additional columns as a sign that this hasn't been
+       // done yet
+       if (_overflowColumns == nullptr)
+       {
+               // Appending to the child collection currently returns S_FALSE on success,
+               // which results in an exception when called from C++
+               try { Children->Append(RichTextContent); } catch (COMException^ ex) { if (ex->HResult != 1) throw ex; }
+               _overflowColumns = ref new Vector<RichTextBlockOverflow^>();
+       }
+
+       // Start by measuring the original RichTextBlock content
+       RichTextContent->Measure(availableSize);
+       auto maxWidth = RichTextContent->DesiredSize.Width;
+       auto maxHeight = RichTextContent->DesiredSize.Height;
+       auto hasOverflow = RichTextContent->HasOverflowContent;
+
+       // Make sure there are enough overflow columns
+       unsigned int overflowIndex = 0;
+       while (hasOverflow && maxWidth < availableSize.Width && ColumnTemplate != nullptr)
+       {
+               // Use existing overflow columns until we run out, then create
+               // more from the supplied template
+               RichTextBlockOverflow^ overflow;
+               if (_overflowColumns->Size > overflowIndex)
+               {
+                       overflow = _overflowColumns->GetAt(overflowIndex);
+               }
+               else
+               {
+                       overflow = safe_cast<RichTextBlockOverflow^>(ColumnTemplate->LoadContent());
+                       _overflowColumns->Append(overflow);
+                       // Appending to the child collection currently returns S_FALSE on success,
+                       // which results in an exception when called from C++
+                       try { Children->Append(overflow); } catch (COMException^ ex) { if (ex->HResult != 1) throw ex; }
+                       if (overflowIndex == 0)
+                       {
+                               RichTextContent->OverflowContentTarget = overflow;
+                       }
+                       else
+                       {
+                               _overflowColumns->GetAt(overflowIndex - 1)->OverflowContentTarget = overflow;
+                       }
+               }
+
+               // Measure the new column and prepare to repeat as necessary
+               Size remainingSize(availableSize.Width - maxWidth, availableSize.Height);
+               overflow->Measure(remainingSize);
+               maxWidth += overflow->DesiredSize.Width;
+               maxHeight = __max(maxHeight, overflow->DesiredSize.Height);
+               hasOverflow = overflow->HasOverflowContent;
+               overflowIndex++;
+       }
+
+       // Disconnect extra columns from the overflow chain, remove them from our private list
+       // of columns, and remove them as children
+       if (_overflowColumns->Size > overflowIndex)
+       {
+               if (overflowIndex == 0)
+               {
+                       RichTextContent->OverflowContentTarget = nullptr;
+               }
+               else
+               {
+                       _overflowColumns->GetAt(overflowIndex - 1)->OverflowContentTarget = nullptr;
+               }
+               while (_overflowColumns->Size > overflowIndex)
+               {
+                       _overflowColumns->RemoveAt(overflowIndex);
+                       Children->RemoveAt(overflowIndex + 1);
+               }
+       }
+
+       // Report final determined size
+       Size resultingSize(maxWidth, maxHeight);
+       return resultingSize;
+}
+
+/// <summary>
+/// Arranges the original content and all extra columns.
+/// </summary>
+/// <param name="finalSize">Defines the size of the area the children must be arranged
+/// within.</param>
+/// <returns>The size of the area the children actually required.</returns>
+Size RichTextColumns::ArrangeOverride(Size finalSize)
+{
+       float maxWidth = 0;
+       float maxHeight = 0;
+       auto childrenIterator = Children->First();
+       while (childrenIterator->HasCurrent)
+       {
+               auto child = childrenIterator->Current;
+               Rect childRect(maxWidth, 0, child->DesiredSize.Width, finalSize.Height);
+               child->Arrange(childRect);
+               maxWidth += child->DesiredSize.Width;
+               maxHeight = __max(maxHeight, child->DesiredSize.Height);
+               childrenIterator->MoveNext();
+       }
+       Size resultingSize(maxWidth, maxHeight);
+       return resultingSize;
+}
diff --git a/ShootingGame/Common/RichTextColumns.h b/ShootingGame/Common/RichTextColumns.h
new file mode 100644 (file)
index 0000000..fd2b20a
--- /dev/null
@@ -0,0 +1,69 @@
+#pragma once
+
+#include "pch.h"
+#include <collection.h>
+
+namespace ShootingGame
+{
+       namespace Common
+       {
+               /// <summary>
+               /// Wrapper for <see cref="RichTextBlock"/> that creates as many additional overflow
+               /// columns as needed to fit the available content.
+               /// </summary>
+               /// <example>
+               /// The following creates a collection of 400-pixel wide columns spaced 50 pixels apart
+               /// to contain arbitrary data-bound content:
+               /// <code>
+               /// <RichTextColumns>
+               ///     <RichTextColumns.ColumnTemplate>
+               ///         <DataTemplate>
+               ///             <RichTextBlockOverflow Width="400" Margin="50,0,0,0"/>
+               ///         </DataTemplate>
+               ///     </RichTextColumns.ColumnTemplate>
+               ///     
+               ///     <RichTextBlock Width="400">
+               ///         <Paragraph>
+               ///             <Run Text="{Binding Content}"/>
+               ///         </Paragraph>
+               ///     </RichTextBlock>
+               /// </RichTextColumns>
+               /// </code>
+               /// </example>
+               /// <remarks>Typically used in a horizontally scrolling region where an unbounded amount of
+               /// space allows for all needed columns to be created.  When used in a vertically scrolling
+               /// space there will never be any additional columns.</remarks>
+               [Windows::UI::Xaml::Markup::ContentProperty(Name = "RichTextContent")]
+               public ref class RichTextColumns sealed : Windows::UI::Xaml::Controls::Panel
+               {
+               public:
+                       RichTextColumns();
+                       static property Windows::UI::Xaml::DependencyProperty^ RichTextContentProperty
+                       {
+                               Windows::UI::Xaml::DependencyProperty^ get();
+                       };
+                       static property Windows::UI::Xaml::DependencyProperty^ ColumnTemplateProperty
+                       {
+                               Windows::UI::Xaml::DependencyProperty^ get();
+                       }
+                       property Windows::UI::Xaml::DataTemplate^ ColumnTemplate
+                       {
+                               Windows::UI::Xaml::DataTemplate^ get() { return safe_cast<Windows::UI::Xaml::DataTemplate^>(GetValue(ColumnTemplateProperty)); }
+                               void set(Windows::UI::Xaml::DataTemplate^ value) { SetValue(ColumnTemplateProperty, value); }
+                       };
+                       property Windows::UI::Xaml::Controls::RichTextBlock^ RichTextContent
+                       {
+                               Windows::UI::Xaml::Controls::RichTextBlock^ get() { return safe_cast<Windows::UI::Xaml::Controls::RichTextBlock^>(GetValue(RichTextContentProperty)); }
+                               void set(Windows::UI::Xaml::Controls::RichTextBlock^ value) { SetValue(RichTextContentProperty, value); }
+                       };
+
+               protected:
+                       virtual Windows::Foundation::Size MeasureOverride(Windows::Foundation::Size availableSize) override;
+                       virtual Windows::Foundation::Size ArrangeOverride(Windows::Foundation::Size finalSize) override;
+
+               private:
+                       Platform::Collections::Vector<Windows::UI::Xaml::Controls::RichTextBlockOverflow^>^ _overflowColumns;
+                       static void ResetOverflowLayout(Windows::UI::Xaml::DependencyObject^ d, Windows::UI::Xaml::DependencyPropertyChangedEventArgs^ e);
+               };
+       }
+}
diff --git a/ShootingGame/Common/StandardStyles.xaml b/ShootingGame/Common/StandardStyles.xaml
new file mode 100644 (file)
index 0000000..d480380
--- /dev/null
@@ -0,0 +1,943 @@
+<ResourceDictionary
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+
+    <!-- Non-brush values that vary across themes -->
+    
+    <ResourceDictionary.ThemeDictionaries>
+        <ResourceDictionary x:Key="Default">
+            <x:String x:Key="BackButtonGlyph">&#xE071;</x:String>
+            <x:String x:Key="BackButtonSnappedGlyph">&#xE0BA;</x:String>
+        </ResourceDictionary>
+
+        <ResourceDictionary x:Key="HighContrast">
+            <x:String x:Key="BackButtonGlyph">&#xE0A6;</x:String>
+            <x:String x:Key="BackButtonSnappedGlyph">&#xE0C4;</x:String>
+        </ResourceDictionary>
+    </ResourceDictionary.ThemeDictionaries>
+
+    <!-- RichTextBlock styles -->
+
+    <Style x:Key="BasicRichTextStyle" TargetType="RichTextBlock">
+        <Setter Property="Foreground" Value="{StaticResource ApplicationTextBrush}"/>
+        <Setter Property="FontSize" Value="{StaticResource ContentFontSize}"/>
+        <Setter Property="FontFamily" Value="{StaticResource ContentFontFamily}"/>
+        <Setter Property="TextTrimming" Value="WordEllipsis"/>
+        <Setter Property="TextWrapping" Value="Wrap"/>
+        <Setter Property="Typography.StylisticSet20" Value="True"/>
+        <Setter Property="Typography.DiscretionaryLigatures" Value="True"/>
+    </Style>
+
+    <Style x:Key="BaselineRichTextStyle" TargetType="RichTextBlock" BasedOn="{StaticResource BasicRichTextStyle}">
+        <Setter Property="LineHeight" Value="20"/>
+        <Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
+        <!-- Properly align text along its baseline -->
+        <Setter Property="RenderTransform">
+            <Setter.Value>
+                <TranslateTransform X="-1" Y="4"/>
+            </Setter.Value>
+        </Setter>
+    </Style>
+
+    <Style x:Key="ItemRichTextStyle" TargetType="RichTextBlock" BasedOn="{StaticResource BaselineRichTextStyle}"/>
+
+    <Style x:Key="BodyRichTextStyle" TargetType="RichTextBlock" BasedOn="{StaticResource BaselineRichTextStyle}">
+        <Setter Property="FontWeight" Value="SemiLight"/>
+    </Style>
+
+    <!-- TextBlock styles -->
+
+    <Style x:Key="BasicTextStyle" TargetType="TextBlock">
+        <Setter Property="Foreground" Value="{StaticResource ApplicationTextBrush}"/>
+        <Setter Property="FontSize" Value="{StaticResource ContentFontSize}"/>
+        <Setter Property="FontFamily" Value="{StaticResource ContentFontFamily}"/>
+        <Setter Property="TextTrimming" Value="WordEllipsis"/>
+        <Setter Property="TextWrapping" Value="Wrap"/>
+        <Setter Property="Typography.StylisticSet20" Value="True"/>
+        <Setter Property="Typography.DiscretionaryLigatures" Value="True"/>
+    </Style>
+
+    <Style x:Key="BaselineTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BasicTextStyle}">
+        <Setter Property="LineHeight" Value="20"/>
+        <Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
+        <!-- Properly align text along its baseline -->
+        <Setter Property="RenderTransform">
+            <Setter.Value>
+                <TranslateTransform X="-1" Y="4"/>
+            </Setter.Value>
+        </Setter>
+    </Style>
+
+    <Style x:Key="HeaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+        <Setter Property="FontSize" Value="56"/>
+        <Setter Property="FontWeight" Value="Light"/>
+        <Setter Property="LineHeight" Value="40"/>
+        <Setter Property="RenderTransform">
+            <Setter.Value>
+                <TranslateTransform X="-2" Y="8"/>
+            </Setter.Value>
+        </Setter>
+    </Style>
+
+    <Style x:Key="SubheaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+        <Setter Property="FontSize" Value="26.667"/>
+        <Setter Property="FontWeight" Value="Light"/>
+        <Setter Property="LineHeight" Value="30"/>
+        <Setter Property="RenderTransform">
+            <Setter.Value>
+                <TranslateTransform X="-1" Y="6"/>
+            </Setter.Value>
+        </Setter>
+    </Style>
+
+    <Style x:Key="TitleTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+        <Setter Property="FontWeight" Value="SemiBold"/>
+    </Style>
+
+    <Style x:Key="ItemTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}"/>
+
+    <Style x:Key="BodyTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+        <Setter Property="FontWeight" Value="SemiLight"/>
+    </Style>
+
+    <Style x:Key="CaptionTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BaselineTextStyle}">
+        <Setter Property="FontSize" Value="12"/>
+        <Setter Property="Foreground" Value="{StaticResource ApplicationSecondaryTextBrush}"/>
+    </Style>
+
+    <!-- Button styles -->
+
+    <!--
+        TextButtonStyle is used to style a Button using subheader-styled text with no other adornment.  This
+        style is used in the GroupedItemsPage as a group header and in the FileOpenPickerPage for triggering
+        commands.
+    -->
+    <Style x:Key="TextButtonStyle" TargetType="Button">
+        <Setter Property="MinWidth" Value="0"/>
+        <Setter Property="MinHeight" Value="0"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="Button">
+                    <Grid Background="Transparent">
+                        <TextBlock
+                            x:Name="Text"
+                            Text="{TemplateBinding Content}"
+                            Margin="3,-7,3,10"
+                            TextWrapping="NoWrap"
+                            Style="{StaticResource SubheaderTextStyle}"/>
+                        <Rectangle
+                            x:Name="FocusVisualWhite"
+                            IsHitTestVisible="False"
+                            Stroke="{StaticResource FocusVisualWhiteStrokeBrush}"
+                            StrokeEndLineCap="Square"
+                            StrokeDashArray="1,1"
+                            Opacity="0"
+                            StrokeDashOffset="1.5"/>
+                        <Rectangle
+                            x:Name="FocusVisualBlack"
+                            IsHitTestVisible="False"
+                            Stroke="{StaticResource FocusVisualBlackStrokeBrush}"
+                            StrokeEndLineCap="Square"
+                            StrokeDashArray="1,1"
+                            Opacity="0"
+                            StrokeDashOffset="0.5"/>
+
+                        <VisualStateManager.VisualStateGroups>
+                            <VisualStateGroup x:Name="CommonStates">
+                                <VisualState x:Name="Normal"/>
+                                <VisualState x:Name="PointerOver">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationHoverTextBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Pressed">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPressedTextBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Disabled">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ControlDisabledTextBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                            </VisualStateGroup>
+                            <VisualStateGroup x:Name="FocusStates">
+                                <VisualState x:Name="Focused">
+                                    <Storyboard>
+                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualWhite" Storyboard.TargetProperty="Opacity"/>
+                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualBlack" Storyboard.TargetProperty="Opacity"/>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Unfocused"/>
+                            </VisualStateGroup>
+                        </VisualStateManager.VisualStateGroups>
+                    </Grid>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+
+    <!--
+        TextRadioButtonStyle is used to style a RadioButton using subheader-styled text with no other adornment.
+        This style is used in the SearchResultsPage to allow selection among filters.
+    -->
+    <Style x:Key="TextRadioButtonStyle" TargetType="RadioButton">
+        <Setter Property="MinWidth" Value="0"/>
+        <Setter Property="MinHeight" Value="0"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="RadioButton">
+                    <Grid Background="Transparent">
+                        <TextBlock
+                            x:Name="Text"
+                            Text="{TemplateBinding Content}"
+                            Margin="3,-7,3,10"
+                            TextWrapping="NoWrap"
+                            Style="{StaticResource SubheaderTextStyle}"/>
+                        <Rectangle
+                            x:Name="FocusVisualWhite"
+                            IsHitTestVisible="False"
+                            Stroke="{StaticResource FocusVisualWhiteStrokeBrush}"
+                            StrokeEndLineCap="Square"
+                            StrokeDashArray="1,1"
+                            Opacity="0"
+                            StrokeDashOffset="1.5"/>
+                        <Rectangle
+                            x:Name="FocusVisualBlack"
+                            IsHitTestVisible="False"
+                            Stroke="{StaticResource FocusVisualBlackStrokeBrush}"
+                            StrokeEndLineCap="Square"
+                            StrokeDashArray="1,1"
+                            Opacity="0"
+                            StrokeDashOffset="0.5"/>
+
+                        <VisualStateManager.VisualStateGroups>
+                            <VisualStateGroup x:Name="CommonStates">
+                                <VisualState x:Name="Normal"/>
+                                <VisualState x:Name="PointerOver">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationHoverTextBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Pressed">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPressedTextBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Disabled">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ControlDisabledTextBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                            </VisualStateGroup>
+                            <VisualStateGroup x:Name="FocusStates">
+                                <VisualState x:Name="Focused">
+                                    <Storyboard>
+                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualWhite" Storyboard.TargetProperty="Opacity"/>
+                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualBlack" Storyboard.TargetProperty="Opacity"/>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Unfocused"/>
+                            </VisualStateGroup>
+                            <VisualStateGroup x:Name="CheckStates">
+                                <VisualState x:Name="Checked"/>
+                                <VisualState x:Name="Unchecked">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationSecondaryTextBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Indeterminate"/>
+                            </VisualStateGroup>
+                        </VisualStateManager.VisualStateGroups>
+                    </Grid>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+
+    <!--
+        AppBarButtonStyle is used to style a Button for use in an App Bar.  Content will be centered and should fit within
+        the 40-pixel radius glyph provided.  16-point Segoe UI Symbol is used for content text to simplify the use of glyphs
+        from that font.  AutomationProperties.Name is used for the text below the glyph.
+    -->
+    <Style x:Key="AppBarButtonStyle" TargetType="Button">
+        <Setter Property="Foreground" Value="{StaticResource AppBarItemForegroundBrush}"/>
+        <Setter Property="VerticalAlignment" Value="Stretch"/>
+        <Setter Property="FontFamily" Value="Segoe UI Symbol"/>
+        <Setter Property="FontWeight" Value="Normal"/>
+        <Setter Property="FontSize" Value="21.333"/>
+        <Setter Property="AutomationProperties.ItemType" Value="App Bar Button"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="Button">
+                    <Grid Width="100" Background="Transparent">
+                        <StackPanel VerticalAlignment="Top" Margin="0,14,0,13">
+                            <Grid Width="40" Height="40" Margin="0,0,0,5" HorizontalAlignment="Center">
+                                <TextBlock x:Name="BackgroundGlyph" Text="&#xE0A8;" FontFamily="Segoe UI Symbol" FontSize="53.333" Margin="-4,-19,0,0" Foreground="{StaticResource AppBarItemBackgroundBrush}"/>
+                                <TextBlock x:Name="OutlineGlyph" Text="&#xE0A7;" FontFamily="Segoe UI Symbol" FontSize="53.333" Margin="-4,-19,0,0"/>
+                                <ContentPresenter x:Name="Content" HorizontalAlignment="Center" Margin="-1,-1,0,0" VerticalAlignment="Center"/>
+                            </Grid>
+                            <TextBlock
+                                x:Name="TextLabel"
+                                Text="{TemplateBinding AutomationProperties.Name}"
+                                Margin="0,0,2,0"
+                                FontSize="12"
+                                TextAlignment="Center"
+                                Width="88"
+                                MaxHeight="32"
+                                TextTrimming="WordEllipsis"
+                                Style="{StaticResource BasicTextStyle}"/>
+                        </StackPanel>
+                        <Rectangle
+                                x:Name="FocusVisualWhite"
+                                IsHitTestVisible="False"
+                                Stroke="{StaticResource FocusVisualWhiteStrokeBrush}"
+                                StrokeEndLineCap="Square"
+                                StrokeDashArray="1,1"
+                                Opacity="0"
+                                StrokeDashOffset="1.5"/>
+                        <Rectangle
+                                x:Name="FocusVisualBlack"
+                                IsHitTestVisible="False"
+                                Stroke="{StaticResource FocusVisualBlackStrokeBrush}"
+                                StrokeEndLineCap="Square"
+                                StrokeDashArray="1,1"
+                                Opacity="0"
+                                StrokeDashOffset="0.5"/>
+
+                        <VisualStateManager.VisualStateGroups>
+                            <VisualStateGroup x:Name="CommonStates">
+                                <VisualState x:Name="Normal"/>
+                                <VisualState x:Name="PointerOver">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemHoverBackgroundBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Content" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemHoverForegroundBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Pressed">
+                                    <Storyboard>
+                                        <DoubleAnimation
+                                            Storyboard.TargetName="OutlineGlyph"
+                                            Storyboard.TargetProperty="Opacity"
+                                            To="0"
+                                            Duration="0"/>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemForegroundBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Content" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemPressedForegroundBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Disabled">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="OutlineGlyph" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemDisabledForegroundBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Content" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemDisabledForegroundBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TextLabel" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource AppBarItemDisabledForegroundBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                            </VisualStateGroup>
+                            <VisualStateGroup x:Name="FocusStates">
+                                <VisualState x:Name="Focused">
+                                    <Storyboard>
+                                        <DoubleAnimation
+                                                Storyboard.TargetName="FocusVisualWhite"
+                                                Storyboard.TargetProperty="Opacity"
+                                                To="1"
+                                                Duration="0"/>
+                                        <DoubleAnimation
+                                                Storyboard.TargetName="FocusVisualBlack"
+                                                Storyboard.TargetProperty="Opacity"
+                                                To="1"
+                                                Duration="0"/>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Unfocused" />
+                                <VisualState x:Name="PointerFocused" />
+                            </VisualStateGroup>
+                        </VisualStateManager.VisualStateGroups>
+                    </Grid>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+
+    <!-- Standard App Bar buttons -->
+  
+    <Style x:Key="SkipBackAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="SkipBackAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Skip Back"/>
+        <Setter Property="Content" Value="&#xE100;"/>
+    </Style>
+    <Style x:Key="SkipAheadAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="SkipAheadAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Skip Ahead"/>
+        <Setter Property="Content" Value="&#xE101;"/>
+    </Style>
+    <Style x:Key="PlayAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="PlayAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Play"/>
+        <Setter Property="Content" Value="&#xE102;"/>
+    </Style>
+    <Style x:Key="PauseAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="PauseAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Pause"/>
+        <Setter Property="Content" Value="&#xE103;"/>
+    </Style>
+    <Style x:Key="EditAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="EditAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Edit"/>
+        <Setter Property="Content" Value="&#xE104;"/>
+    </Style>
+    <Style x:Key="SaveAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="SaveAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Save"/>
+        <Setter Property="Content" Value="&#xE105;"/>
+    </Style>
+    <Style x:Key="DeleteAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="DeleteAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Delete"/>
+        <Setter Property="Content" Value="&#xE106;"/>
+    </Style>
+    <Style x:Key="DiscardAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="DiscardAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Discard"/>
+        <Setter Property="Content" Value="&#xE107;"/>
+    </Style>
+    <Style x:Key="RemoveAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="RemoveAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Remove"/>
+        <Setter Property="Content" Value="&#xE108;"/>
+    </Style>
+    <Style x:Key="AddAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="AddAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Add"/>
+        <Setter Property="Content" Value="&#xE109;"/>
+    </Style>
+    <Style x:Key="NoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="NoAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="No"/>
+        <Setter Property="Content" Value="&#xE10A;"/>
+    </Style>
+    <Style x:Key="YesAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="YesAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Yes"/>
+        <Setter Property="Content" Value="&#xE10B;"/>
+    </Style>
+    <Style x:Key="MoreAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="MoreAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="More"/>
+        <Setter Property="Content" Value="&#xE10C;"/>
+    </Style>
+    <Style x:Key="RedoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="RedoAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Redo"/>
+        <Setter Property="Content" Value="&#xE10D;"/>
+    </Style>
+    <Style x:Key="UndoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="UndoAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Undo"/>
+        <Setter Property="Content" Value="&#xE10E;"/>
+    </Style>
+    <Style x:Key="HomeAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="HomeAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Home"/>
+        <Setter Property="Content" Value="&#xE10F;"/>
+    </Style>
+    <Style x:Key="OutAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="OutAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Out"/>
+        <Setter Property="Content" Value="&#xE110;"/>
+    </Style>
+    <Style x:Key="NextAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="NextAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Next"/>
+        <Setter Property="Content" Value="&#xE111;"/>
+    </Style>
+    <Style x:Key="PreviousAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="PreviousAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Previous"/>
+        <Setter Property="Content" Value="&#xE112;"/>
+    </Style>
+    <Style x:Key="FavoriteAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="FavoriteAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Favorite"/>
+        <Setter Property="Content" Value="&#xE113;"/>
+    </Style>
+    <Style x:Key="PhotoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="PhotoAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Photo"/>
+        <Setter Property="Content" Value="&#xE114;"/>
+    </Style>
+    <Style x:Key="SettingsAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="SettingsAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Settings"/>
+        <Setter Property="Content" Value="&#xE115;"/>
+    </Style>
+    <Style x:Key="VideoAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="VideoAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Video"/>
+        <Setter Property="Content" Value="&#xE116;"/>
+    </Style>
+    <Style x:Key="RefreshAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="RefreshAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Refresh"/>
+        <Setter Property="Content" Value="&#xE117;"/>
+    </Style>
+    <Style x:Key="DownloadAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="DownloadAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Download"/>
+        <Setter Property="Content" Value="&#xE118;"/>
+    </Style>
+    <Style x:Key="MailAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="MailAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Mail"/>
+        <Setter Property="Content" Value="&#xE119;"/>
+    </Style>
+    <Style x:Key="SearchAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="SearchAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Search"/>
+        <Setter Property="Content" Value="&#xE11A;"/>
+    </Style>
+    <Style x:Key="HelpAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="HelpAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Help"/>
+        <Setter Property="Content" Value="&#xE11B;"/>
+    </Style>
+    <Style x:Key="UploadAppBarButtonStyle" TargetType="Button" BasedOn="{StaticResource AppBarButtonStyle}">
+        <Setter Property="AutomationProperties.AutomationId" Value="UploadAppBarButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Upload"/>
+        <Setter Property="Content" Value="&#xE11C;"/>
+    </Style>
+
+    <!-- Title area styles -->
+
+    <Style x:Key="PageHeaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource HeaderTextStyle}">
+        <Setter Property="TextWrapping" Value="NoWrap"/>
+        <Setter Property="VerticalAlignment" Value="Bottom"/>
+        <Setter Property="Margin" Value="0,0,40,40"/>
+    </Style>
+
+    <Style x:Key="PageSubheaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource SubheaderTextStyle}">
+        <Setter Property="TextWrapping" Value="NoWrap"/>
+        <Setter Property="VerticalAlignment" Value="Bottom"/>
+        <Setter Property="Margin" Value="0,0,0,40"/>
+    </Style>
+
+    <Style x:Key="SnappedPageHeaderTextStyle" TargetType="TextBlock" BasedOn="{StaticResource PageSubheaderTextStyle}">
+        <Setter Property="Margin" Value="0,0,18,40"/>
+    </Style>
+
+    <!--
+        BackButtonStyle is used to style a Button for use in the title area of a page.  Margins appropriate for
+        the conventional page layout are included as part of the style.
+    -->
+    <Style x:Key="BackButtonStyle" TargetType="Button">
+        <Setter Property="MinWidth" Value="0"/>
+        <Setter Property="Width" Value="48"/>
+        <Setter Property="Height" Value="48"/>
+        <Setter Property="Margin" Value="36,0,36,36"/>
+        <Setter Property="VerticalAlignment" Value="Bottom"/>
+        <Setter Property="FontFamily" Value="Segoe UI Symbol"/>
+        <Setter Property="FontWeight" Value="Normal"/>
+        <Setter Property="FontSize" Value="56"/>
+        <Setter Property="AutomationProperties.AutomationId" Value="BackButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Back"/>
+        <Setter Property="AutomationProperties.ItemType" Value="Navigation Button"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="Button">
+                    <Grid x:Name="RootGrid">
+                        <Grid Margin="-1,-16,0,0">
+                            <TextBlock x:Name="BackgroundGlyph" Text="&#xE0A8;" Foreground="{StaticResource BackButtonBackgroundBrush}"/>
+                            <TextBlock x:Name="NormalGlyph" Text="{StaticResource BackButtonGlyph}" Foreground="{StaticResource BackButtonGlyphBrush}"/>
+                            <TextBlock x:Name="ArrowGlyph" Text="&#xE0A6;" Foreground="{StaticResource BackButtonPressedGlyphBrush}" Opacity="0"/>
+                        </Grid>
+                        <Rectangle
+                            x:Name="FocusVisualWhite"
+                            IsHitTestVisible="False"
+                            Stroke="{StaticResource FocusVisualWhiteStrokeBrush}"
+                            StrokeEndLineCap="Square"
+                            StrokeDashArray="1,1"
+                            Opacity="0"
+                            StrokeDashOffset="1.5"/>
+                        <Rectangle
+                            x:Name="FocusVisualBlack"
+                            IsHitTestVisible="False"
+                            Stroke="{StaticResource FocusVisualBlackStrokeBrush}"
+                            StrokeEndLineCap="Square"
+                            StrokeDashArray="1,1"
+                            Opacity="0"
+                            StrokeDashOffset="0.5"/>
+
+                        <VisualStateManager.VisualStateGroups>
+                            <VisualStateGroup x:Name="CommonStates">
+                                <VisualState x:Name="Normal" />
+                                <VisualState x:Name="PointerOver">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonHoverBackgroundBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalGlyph" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonHoverGlyphBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Pressed">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonGlyphBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                        <DoubleAnimation
+                                            Storyboard.TargetName="ArrowGlyph"
+                                            Storyboard.TargetProperty="Opacity"
+                                            To="1"
+                                            Duration="0"/>
+                                        <DoubleAnimation
+                                            Storyboard.TargetName="NormalGlyph"
+                                            Storyboard.TargetProperty="Opacity"
+                                            To="0"
+                                            Duration="0"/>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Disabled">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootGrid" Storyboard.TargetProperty="Visibility">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                            </VisualStateGroup>
+                            <VisualStateGroup x:Name="FocusStates">
+                                <VisualState x:Name="Focused">
+                                    <Storyboard>
+                                        <DoubleAnimation
+                                            Storyboard.TargetName="FocusVisualWhite"
+                                            Storyboard.TargetProperty="Opacity"
+                                            To="1"
+                                            Duration="0"/>
+                                        <DoubleAnimation
+                                            Storyboard.TargetName="FocusVisualBlack"
+                                            Storyboard.TargetProperty="Opacity"
+                                            To="1"
+                                            Duration="0"/>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Unfocused" />
+                                <VisualState x:Name="PointerFocused" />
+                            </VisualStateGroup>
+                        </VisualStateManager.VisualStateGroups>
+                    </Grid>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+
+    <!--
+        PortraitBackButtonStyle is used to style a Button for use in the title area of a portrait page.  Margins appropriate
+        for the conventional page layout are included as part of the style.
+    -->
+    <Style x:Key="PortraitBackButtonStyle" TargetType="Button" BasedOn="{StaticResource BackButtonStyle}">
+        <Setter Property="Margin" Value="26,0,26,36"/>
+    </Style>
+
+    <!--
+        SnappedBackButtonStyle is used to style a Button for use in the title area of a snapped page.  Margins appropriate
+        for the conventional page layout are included as part of the style.
+        
+        The obvious duplication here is necessary as the glyphs used in snapped are not merely smaller versions of the same
+        glyph but are actually distinct.
+    -->
+    <Style x:Key="SnappedBackButtonStyle" TargetType="Button">
+        <Setter Property="MinWidth" Value="0"/>
+        <Setter Property="Margin" Value="20,0,0,0"/>
+        <Setter Property="VerticalAlignment" Value="Bottom"/>
+        <Setter Property="FontFamily" Value="Segoe UI Symbol"/>
+        <Setter Property="FontWeight" Value="Normal"/>
+        <Setter Property="FontSize" Value="26.66667"/>
+        <Setter Property="AutomationProperties.AutomationId" Value="BackButton"/>
+        <Setter Property="AutomationProperties.Name" Value="Back"/>
+        <Setter Property="AutomationProperties.ItemType" Value="Navigation Button"/>
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="Button">
+                    <Grid x:Name="RootGrid" Width="36" Height="36" Margin="-3,0,7,33">
+                        <Grid Margin="-1,-1,0,0">
+                            <TextBlock x:Name="BackgroundGlyph" Text="&#xE0D4;" Foreground="{StaticResource BackButtonBackgroundBrush}"/>
+                            <TextBlock x:Name="NormalGlyph" Text="{StaticResource BackButtonSnappedGlyph}" Foreground="{StaticResource BackButtonGlyphBrush}"/>
+                            <TextBlock x:Name="ArrowGlyph" Text="&#xE0C4;" Foreground="{StaticResource BackButtonPressedGlyphBrush}" Opacity="0"/>
+                        </Grid>
+                        <Rectangle
+                            x:Name="FocusVisualWhite"
+                            IsHitTestVisible="False"
+                            Stroke="{StaticResource FocusVisualWhiteStrokeBrush}"
+                            StrokeEndLineCap="Square"
+                            StrokeDashArray="1,1"
+                            Opacity="0"
+                            StrokeDashOffset="1.5"/>
+                        <Rectangle
+                            x:Name="FocusVisualBlack"
+                            IsHitTestVisible="False"
+                            Stroke="{StaticResource FocusVisualBlackStrokeBrush}"
+                            StrokeEndLineCap="Square"
+                            StrokeDashArray="1,1"
+                            Opacity="0"
+                            StrokeDashOffset="0.5"/>
+
+                        <VisualStateManager.VisualStateGroups>
+                            <VisualStateGroup x:Name="CommonStates">
+                                <VisualState x:Name="Normal" />
+                                <VisualState x:Name="PointerOver">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonHoverBackgroundBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NormalGlyph" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonHoverGlyphBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Pressed">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundGlyph" Storyboard.TargetProperty="Foreground">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource BackButtonGlyphBrush}"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                        <DoubleAnimation
+                                            Storyboard.TargetName="ArrowGlyph"
+                                            Storyboard.TargetProperty="Opacity"
+                                            To="1"
+                                            Duration="0"/>
+                                        <DoubleAnimation
+                                            Storyboard.TargetName="NormalGlyph"
+                                            Storyboard.TargetProperty="Opacity"
+                                            To="0"
+                                            Duration="0"/>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Disabled">
+                                    <Storyboard>
+                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootGrid" Storyboard.TargetProperty="Visibility">
+                                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
+                                        </ObjectAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </VisualState>
+                            </VisualStateGroup>
+                            <VisualStateGroup x:Name="FocusStates">
+                                <VisualState x:Name="Focused">
+                                    <Storyboard>
+                                        <DoubleAnimation
+                                            Storyboard.TargetName="FocusVisualWhite"
+                                            Storyboard.TargetProperty="Opacity"
+                                            To="1"
+                                            Duration="0"/>
+                                        <DoubleAnimation
+                                            Storyboard.TargetName="FocusVisualBlack"
+                                            Storyboard.TargetProperty="Opacity"
+                                            To="1"
+                                            Duration="0"/>
+                                    </Storyboard>
+                                </VisualState>
+                                <VisualState x:Name="Unfocused" />
+                                <VisualState x:Name="PointerFocused" />
+                            </VisualStateGroup>
+                        </VisualStateManager.VisualStateGroups>
+                    </Grid>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+
+    <!-- Item templates -->
+
+    <!-- Grid-appropriate 250 pixel square item template as seen in the GroupedItemsPage and ItemsPage -->
+    <DataTemplate x:Key="Standard250x250ItemTemplate">
+        <Grid HorizontalAlignment="Left" Width="250" Height="250">
+            <Border Background="{StaticResource ListViewItemPlaceholderRectBrush}">
+                <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+            </Border>
+            <StackPanel VerticalAlignment="Bottom" Background="{StaticResource ListViewItemOverlayBackgroundBrush}">
+                <TextBlock Text="{Binding Title}" Foreground="{StaticResource ListViewItemOverlayTextBrush}" Style="{StaticResource TitleTextStyle}" Height="60" Margin="15,0,15,0"/>
+                <TextBlock Text="{Binding Subtitle}" Foreground="{StaticResource ListViewItemOverlaySecondaryTextBrush}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap" Margin="15,0,15,10"/>
+            </StackPanel>
+        </Grid>
+    </DataTemplate>
+
+    <!-- Grid-appropriate 500 by 130 pixel item template as seen in the GroupDetailPage -->
+    <DataTemplate x:Key="Standard500x130ItemTemplate">
+        <Grid Height="110" Width="480" Margin="10">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="*"/>
+            </Grid.ColumnDefinitions>
+            <Border Background="{StaticResource ListViewItemPlaceholderRectBrush}" Width="110" Height="110">
+                <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+            </Border>
+            <StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="10,0,0,0">
+                <TextBlock Text="{Binding Title}" Style="{StaticResource TitleTextStyle}" TextWrapping="NoWrap"/>
+                <TextBlock Text="{Binding Subtitle}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap"/>
+                <TextBlock Text="{Binding Description}" Style="{StaticResource BodyTextStyle}" MaxHeight="60"/>
+            </StackPanel>
+        </Grid>
+    </DataTemplate>
+
+    <!-- List-appropriate 130 pixel high item template as seen in the SplitPage -->
+    <DataTemplate x:Key="Standard130ItemTemplate">
+        <Grid Height="110" Margin="6">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="*"/>
+            </Grid.ColumnDefinitions>
+            <Border Background="{StaticResource ListViewItemPlaceholderRectBrush}" Width="110" Height="110">
+                <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+            </Border>
+            <StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="10,0,0,0">
+                <TextBlock Text="{Binding Title}" Style="{StaticResource TitleTextStyle}" TextWrapping="NoWrap"/>
+                <TextBlock Text="{Binding Subtitle}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap"/>
+                <TextBlock Text="{Binding Description}" Style="{StaticResource BodyTextStyle}" MaxHeight="60"/>
+            </StackPanel>
+        </Grid>
+    </DataTemplate>
+
+    <!--
+        List-appropriate 80 pixel high item template as seen in the SplitPage when Filled, and
+        the following pages when snapped: GroupedItemsPage, GroupDetailPage, and ItemsPage
+    -->
+    <DataTemplate x:Key="Standard80ItemTemplate">
+        <Grid Margin="6">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="*"/>
+            </Grid.ColumnDefinitions>
+            <Border Background="{StaticResource ListViewItemPlaceholderRectBrush}" Width="60" Height="60">
+                <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+            </Border>
+            <StackPanel Grid.Column="1" Margin="10,0,0,0">
+                <TextBlock Text="{Binding Title}" Style="{StaticResource ItemTextStyle}" MaxHeight="40"/>
+                <TextBlock Text="{Binding Subtitle}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap"/>
+            </StackPanel>
+        </Grid>
+    </DataTemplate>
+
+    <!-- Grid-appropriate 300 by 70 pixel item template as seen in the SearchResultsPage -->
+    <DataTemplate x:Key="StandardSmallIcon300x70ItemTemplate">
+        <Grid Width="300">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="*"/>
+            </Grid.ColumnDefinitions>
+            <Border Background="{StaticResource ListViewItemPlaceholderRectBrush}" Margin="10,10,0,20" Width="40" Height="40">
+                <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+            </Border>
+            <StackPanel Grid.Column="1" Margin="10,0,10,10">
+                <TextBlock Text="{Binding Title}" Style="{StaticResource BodyTextStyle}" TextWrapping="NoWrap"/>
+                <TextBlock Text="{Binding Subtitle}" Style="{StaticResource BodyTextStyle}" Foreground="{StaticResource ApplicationSecondaryTextBrush}" Height="40"/>
+            </StackPanel>
+        </Grid>
+    </DataTemplate>
+
+    <!-- List-appropriate 70 pixel high item template as seen in the SearchResultsPage when Snapped -->
+    <DataTemplate x:Key="StandardSmallIcon70ItemTemplate">
+        <Grid Margin="6">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto"/>
+                <ColumnDefinition Width="*"/>
+            </Grid.ColumnDefinitions>
+            <Border Background="{StaticResource ListViewItemPlaceholderRectBrush}" Margin="0,0,0,10" Width="40" Height="40">
+                <Image Source="{Binding Image}" Stretch="UniformToFill"/>
+            </Border>
+            <StackPanel Grid.Column="1" Margin="10,-10,0,0">
+                <TextBlock Text="{Binding Title}" Style="{StaticResource BodyTextStyle}" TextWrapping="NoWrap"/>
+                <TextBlock Text="{Binding Subtitle}" Style="{StaticResource BodyTextStyle}" Foreground="{StaticResource ApplicationSecondaryTextBrush}" Height="40"/>
+            </StackPanel>
+        </Grid>
+    </DataTemplate>
+
+  <!--
+      190x130 pixel item template for displaying file previews as seen in the FileOpenPickerPage
+      Includes an elaborate tooltip to display title and description text
+  -->
+  <DataTemplate x:Key="StandardFileWithTooltip190x130ItemTemplate">
+        <Grid>
+            <Grid Background="{StaticResource ListViewItemPlaceholderRectBrush}">
+                <Image
+                    Source="{Binding Image}"
+                    Width="190"
+                    Height="130"
+                    HorizontalAlignment="Center"
+                    VerticalAlignment="Center"
+                    Stretch="Uniform"/>
+            </Grid>
+            <ToolTipService.Placement>Mouse</ToolTipService.Placement>
+            <ToolTipService.ToolTip>
+                <Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="Auto"/>
+                        <ColumnDefinition Width="*"/>
+                    </Grid.ColumnDefinitions>
+
+                    <Grid Background="{StaticResource ListViewItemPlaceholderRectBrush}" Margin="20">
+                        <Image
+                            Source="{Binding Image}"
+                            Width="160"
+                            Height="160"
+                            HorizontalAlignment="Center"
+                            VerticalAlignment="Center"
+                            Stretch="Uniform"/>
+                    </Grid>
+                    <StackPanel Width="200" Grid.Column="1" Margin="0,20,20,20">
+                        <TextBlock Text="{Binding Title}" TextWrapping="NoWrap" Style="{StaticResource BodyTextStyle}"/>
+                        <TextBlock Text="{Binding Description}" MaxHeight="140" Foreground="{StaticResource ApplicationSecondaryTextBrush}" Style="{StaticResource BodyTextStyle}"/>
+                    </StackPanel>
+                </Grid>                    
+            </ToolTipService.ToolTip>
+        </Grid>
+    </DataTemplate>
+
+    <!-- Default to 10-pixel spacing between grid items (after accounting for 4-pixel insets for focus) -->
+
+    <Style TargetType="GridViewItem">
+        <Setter Property="Margin" Value="0,0,2,2" />
+    </Style>
+
+    <!-- ScrollViewer styles -->
+
+    <Style x:Key="HorizontalScrollViewerStyle" TargetType="ScrollViewer">
+        <Setter Property="HorizontalScrollBarVisibility" Value="Auto"/>
+        <Setter Property="VerticalScrollBarVisibility" Value="Disabled"/>
+        <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Enabled" />
+        <Setter Property="ScrollViewer.VerticalScrollMode" Value="Disabled" />
+        <Setter Property="ScrollViewer.ZoomMode" Value="Disabled" />
+    </Style>
+
+    <Style x:Key="VerticalScrollViewerStyle" TargetType="ScrollViewer">
+        <Setter Property="HorizontalScrollBarVisibility" Value="Disabled"/>
+        <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
+        <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled" />
+        <Setter Property="ScrollViewer.VerticalScrollMode" Value="Enabled" />
+        <Setter Property="ScrollViewer.ZoomMode" Value="Disabled" />
+    </Style>
+</ResourceDictionary>
diff --git a/ShootingGame/Package.appxmanifest b/ShootingGame/Package.appxmanifest
new file mode 100644 (file)
index 0000000..0698ebd
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
+
+  <Identity Name="8f4a8078-5eb4-42a6-bcf0-9ac82993c82d"
+            Publisher="CN=sfp.000"
+            Version="1.0.0.0" />
+
+  <Properties>
+    <DisplayName>ShootingGame</DisplayName>
+    <PublisherDisplayName>sfp.000</PublisherDisplayName>
+    <Logo>Assets\StoreLogo.png</Logo>
+    <Description>ShootingGame</Description>
+  </Properties>
+
+  <Prerequisites>
+    <OSMinVersion>6.2</OSMinVersion>
+    <OSMaxVersionTested>6.2</OSMaxVersionTested>
+  </Prerequisites>
+
+  <Resources>
+    <Resource Language="x-generate"/>
+  </Resources>
+
+  <Applications>
+    <Application Id="App"
+        Executable="$targetnametoken$.exe"
+        EntryPoint="ShootingGame.App">
+        <VisualElements
+            DisplayName="ShootingGame"
+            Logo="Assets\Logo.png"
+            SmallLogo="Assets\SmallLogo.png"
+            Description="ShootingGame"
+            ForegroundText="light"
+            BackgroundColor="#222222">
+            <DefaultTile ShowName="allLogos" />
+            <SplashScreen Image="Assets\SplashScreen.png" />
+        </VisualElements>
+    </Application>
+  </Applications>
+  <Capabilities>
+    <Capability Name="internetClient" />
+  </Capabilities>
+</Package>
\ No newline at end of file
diff --git a/ShootingGame/ShootingGame.vcxproj b/ShootingGame/ShootingGame.vcxproj
new file mode 100644 (file)
index 0000000..89c0b10
--- /dev/null
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|ARM">
+      <Configuration>Debug</Configuration>
+      <Platform>ARM</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|ARM">
+      <Configuration>Release</Configuration>
+      <Platform>ARM</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{22ab165e-4668-4790-b3d6-c76a3db0d887}</ProjectGuid>
+    <RootNamespace>ShootingGame</RootNamespace>
+    <DefaultLanguage>ja-JP</DefaultLanguage>
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and '$(VisualStudioVersion)' == ''">$(VCTargetsPath11)</VCTargetsPath>
+    <MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
+    <AppContainerApplication>true</AppContainerApplication>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <PlatformToolset>v110</PlatformToolset>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <PackageCertificateKeyFile>ShootingGame_TemporaryKey.pfx</PackageCertificateKeyFile>
+    <PackageCertificateThumbprint>10BE5E5F3DBAB946BEB360A653BF7E85DEDBF1A4</PackageCertificateThumbprint>
+  </PropertyGroup>
+  <ItemGroup>
+    <ClInclude Include="pch.h" />
+    <ClInclude Include="Common\BindableBase.h" />
+    <ClInclude Include="Common\BooleanToVisibilityConverter.h" />
+    <ClInclude Include="Common\BooleanNegationConverter.h" />
+    <ClInclude Include="Common\LayoutAwarePage.h" />
+    <ClInclude Include="Common\RichTextColumns.h" />
+    <ClInclude Include="App.xaml.h">
+      <DependentUpon>App.xaml</DependentUpon>
+    </ClInclude>
+    <ClInclude Include="BlankPage.xaml.h">
+      <DependentUpon>BlankPage.xaml</DependentUpon>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ApplicationDefinition Include="App.xaml">
+      <SubType>Designer</SubType>
+    </ApplicationDefinition>
+    <Page Include="Common\StandardStyles.xaml">
+      <SubType>Designer</SubType>
+    </Page>
+    <Page Include="BlankPage.xaml">
+      <SubType>Designer</SubType>
+    </Page>
+  </ItemGroup>
+  <ItemGroup>
+    <AppxManifest Include="Package.appxmanifest">
+      <SubType>Designer</SubType>
+    </AppxManifest>
+    <None Include="Common\ReadMe.txt" />
+    <None Include="ShootingGame_TemporaryKey.pfx" />
+  </ItemGroup>
+  <ItemGroup>
+    <Image Include="Assets\Logo.png" />
+    <Image Include="Assets\SmallLogo.png" />
+    <Image Include="Assets\StoreLogo.png" />
+    <Image Include="Assets\SplashScreen.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="App.xaml.cpp">
+      <DependentUpon>App.xaml</DependentUpon>
+    </ClCompile>
+    <ClCompile Include="Common\BindableBase.cpp" />
+    <ClCompile Include="Common\BooleanToVisibilityConverter.cpp" />
+    <ClCompile Include="Common\BooleanNegationConverter.cpp" />
+    <ClCompile Include="Common\LayoutAwarePage.cpp" />
+    <ClCompile Include="Common\RichTextColumns.cpp" />
+    <ClCompile Include="BlankPage.xaml.cpp">
+      <DependentUpon>BlankPage.xaml</DependentUpon>
+    </ClCompile>
+    <ClCompile Include="pch.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/ShootingGame/pch.cpp b/ShootingGame/pch.cpp
new file mode 100644 (file)
index 0000000..ef71c0c
--- /dev/null
@@ -0,0 +1,6 @@
+//
+// pch.cpp
+// 標準ヘッダーをインクルードし、プリコンパイル済みヘッダーを生成します。
+//
+
+#include "pch.h"
diff --git a/ShootingGame/pch.h b/ShootingGame/pch.h
new file mode 100644 (file)
index 0000000..595c6df
--- /dev/null
@@ -0,0 +1,8 @@
+//
+// pch.h
+// 標準システムのインクルード ファイルのヘッダー。
+//
+
+#pragma once
+
+#include "App.xaml.h"