From 70d599cb0238522125e0af493c71372a8718ed48 Mon Sep 17 00:00:00 2001 From: Apress Date: Sun, 16 Oct 2016 16:45:46 +0100 Subject: [PATCH] First commit --- 9781430250340.jpg | Bin 0 -> 11432 bytes LICENSE.txt | 27 + README.md | 15 + Source Code/Chapter 1/GrocerApp/GrocerApp.sln | 46 + .../Chapter 1/GrocerApp/GrocerApp.v11.suo | Bin 0 -> 32768 bytes .../Chapter 1/GrocerApp/GrocerApp/App.xaml | 20 + .../Chapter 1/GrocerApp/GrocerApp/App.xaml.cs | 58 + .../GrocerApp/GrocerApp/Assets/Logo.png | Bin 0 -> 801 bytes .../GrocerApp/GrocerApp/Assets/SmallLogo.png | Bin 0 -> 329 bytes .../GrocerApp/Assets/SplashScreen.png | Bin 0 -> 2146 bytes .../GrocerApp/GrocerApp/Assets/StoreLogo.png | Bin 0 -> 429 bytes .../GrocerApp/Common/StandardStyles.xaml | 1829 ++++++++++++++++ .../GrocerApp/GrocerApp/GrocerApp.csproj | 151 ++ .../GrocerApp/GrocerApp/GrocerApp.csproj.user | 6 + .../GrocerApp/GrocerApp_TemporaryKey.pfx | Bin 0 -> 2504 bytes .../GrocerApp/GrocerApp/MainPage.xaml | 19 + .../GrocerApp/GrocerApp/MainPage.xaml.cs | 35 + .../GrocerApp/GrocerApp/Package.appxmanifest | 42 + .../GrocerApp/Properties/AssemblyInfo.cs | 29 + Source Code/Chapter 2/GrocerApp/GrocerApp.sln | 46 + .../Chapter 2/GrocerApp/GrocerApp.v11.suo | Bin 0 -> 95744 bytes .../Chapter 2/GrocerApp/GrocerApp/App.xaml | 21 + .../Chapter 2/GrocerApp/GrocerApp/App.xaml.cs | 48 + .../GrocerApp/GrocerApp/Assets/Logo.png | Bin 0 -> 801 bytes .../GrocerApp/GrocerApp/Assets/SmallLogo.png | Bin 0 -> 329 bytes .../GrocerApp/Assets/SplashScreen.png | Bin 0 -> 2146 bytes .../GrocerApp/GrocerApp/Assets/StoreLogo.png | Bin 0 -> 429 bytes .../GrocerApp/Common/StandardStyles.xaml | 1829 ++++++++++++++++ .../GrocerApp/GrocerApp/Data/GroceryItem.cs | 31 + .../GrocerApp/GrocerApp/Data/ViewModel.cs | 52 + .../GrocerApp/GrocerApp/GrocerApp.csproj | 172 ++ .../GrocerApp/GrocerApp/GrocerApp.csproj.user | 6 + .../GrocerApp/GrocerApp_TemporaryKey.pfx | Bin 0 -> 2504 bytes .../GrocerApp/GrocerApp/Package.appxmanifest | 42 + .../GrocerApp/GrocerApp/Pages/ItemDetail.xaml | 45 + .../GrocerApp/Pages/ItemDetail.xaml.cs | 73 + .../GrocerApp/GrocerApp/Pages/ListPage.xaml | 42 + .../GrocerApp/Pages/ListPage.xaml.cs | 62 + .../GrocerApp/Pages/NoItemSelected.xaml | 14 + .../GrocerApp/Pages/NoItemSelected.xaml.cs | 34 + .../GrocerApp/Properties/AssemblyInfo.cs | 29 + .../Resources/GrocerResourceDictionary.xaml | 50 + .../GrocerApp/GrocerApp/bin/Debug/App.xaml | 22 + .../GrocerApp/bin/Debug/AppX/App.xaml | 22 + .../GrocerApp/bin/Debug/AppX/AppxManifest.xml | 42 + .../GrocerApp/bin/Debug/AppX/Assets/Logo.png | Bin 0 -> 801 bytes .../bin/Debug/AppX/Assets/SmallLogo.png | Bin 0 -> 329 bytes .../bin/Debug/AppX/Assets/SplashScreen.png | Bin 0 -> 2146 bytes .../bin/Debug/AppX/Assets/StoreLogo.png | Bin 0 -> 429 bytes .../bin/Debug/AppX/Common/StandardStyles.xaml | 1830 ++++++++++++++++ .../GrocerApp/bin/Debug/AppX/GrocerApp.exe | Bin 0 -> 24064 bytes .../GrocerApp/bin/Debug/AppX/GrocerApp.pdb | Bin 0 -> 75264 bytes .../bin/Debug/AppX/Pages/ItemDetail.xaml | 46 + .../bin/Debug/AppX/Pages/ListPage.xaml | 43 + .../bin/Debug/AppX/Pages/NoItemSelected.xaml | 15 + .../Resources/GrocerResourceDictionary.xaml | 51 + .../GrocerApp/bin/Debug/AppX/resources.pri | Bin 0 -> 2568 bytes .../GrocerApp/bin/Debug/AppX/vs.appxrecipe | 82 + .../GrocerApp/bin/Debug/AppxManifest.xml | 42 + .../bin/Debug/Common/StandardStyles.xaml | 1830 ++++++++++++++++ .../bin/Debug/GrocerApp.build.appxrecipe | 62 + .../GrocerApp/bin/Debug/GrocerApp.exe | Bin 0 -> 24064 bytes .../GrocerApp/bin/Debug/GrocerApp.pdb | Bin 0 -> 75264 bytes .../GrocerApp/bin/Debug/MainPage.xaml | 20 + .../GrocerApp/bin/Debug/Pages/ItemDetail.xaml | 46 + .../GrocerApp/bin/Debug/Pages/ListPage.xaml | 43 + .../bin/Debug/Pages/NoItemSelected.xaml | 15 + .../Resources/GrocerResourceDictionary.xaml | 51 + .../GrocerApp/bin/Debug/resources.pri | Bin 0 -> 2568 bytes Source Code/Chapter 3/GrocerApp/GrocerApp.sln | 46 + .../Chapter 3/GrocerApp/GrocerApp.v11.suo | Bin 0 -> 159744 bytes .../Chapter 3/GrocerApp/GrocerApp/App.xaml | 21 + .../Chapter 3/GrocerApp/GrocerApp/App.xaml.cs | 48 + .../GrocerApp/GrocerApp/Assets/Logo.png | Bin 0 -> 801 bytes .../GrocerApp/GrocerApp/Assets/SmallLogo.png | Bin 0 -> 329 bytes .../GrocerApp/Assets/SplashScreen.png | Bin 0 -> 2146 bytes .../GrocerApp/GrocerApp/Assets/StoreLogo.png | Bin 0 -> 429 bytes .../GrocerApp/GrocerApp/Assets/Thumbs.db | Bin 0 -> 3584 bytes .../GrocerApp/Common/StandardStyles.xaml | 1837 +++++++++++++++++ .../GrocerApp/GrocerApp/Data/GroceryItem.cs | 31 + .../GrocerApp/GrocerApp/Data/ViewModel.cs | 52 + .../GrocerApp/Flyouts/AddItemFlyout.xaml | 51 + .../GrocerApp/Flyouts/AddItemFlyout.xaml.cs | 29 + .../GrocerApp/Flyouts/FlyoutHelper.cs | 38 + .../GrocerApp/Flyouts/HomeZipCodeFlyout.xaml | 31 + .../Flyouts/HomeZipCodeFlyout.xaml.cs | 20 + .../GrocerApp/GrocerApp/GrocerApp.csproj | 201 ++ .../GrocerApp/GrocerApp/GrocerApp.csproj.user | 6 + .../GrocerApp/GrocerApp_TemporaryKey.pfx | Bin 0 -> 2504 bytes .../GrocerApp/GrocerApp/Package.appxmanifest | 42 + .../GrocerApp/GrocerApp/Pages/DetailPage.xaml | 15 + .../GrocerApp/Pages/DetailPage.xaml.cs | 34 + .../GrocerApp/GrocerApp/Pages/ItemDetail.xaml | 45 + .../GrocerApp/Pages/ItemDetail.xaml.cs | 73 + .../GrocerApp/GrocerApp/Pages/ListPage.xaml | 84 + .../GrocerApp/Pages/ListPage.xaml.cs | 80 + .../GrocerApp/GrocerApp/Pages/MainPage.xaml | 29 + .../GrocerApp/Pages/MainPage.xaml.cs | 55 + .../GrocerApp/Pages/NoItemSelected.xaml | 14 + .../GrocerApp/Pages/NoItemSelected.xaml.cs | 34 + .../GrocerApp/Properties/AssemblyInfo.cs | 29 + .../Resources/GrocerResourceDictionary.xaml | 214 ++ Source Code/Chapter 4/GrocerApp/GrocerApp.sln | 46 + .../Chapter 4/GrocerApp/GrocerApp.v11.suo | Bin 0 -> 162816 bytes .../Chapter 4/GrocerApp/GrocerApp/App.xaml | 21 + .../Chapter 4/GrocerApp/GrocerApp/App.xaml.cs | 48 + .../GrocerApp/GrocerApp/Assets/Logo.png | Bin 0 -> 801 bytes .../GrocerApp/GrocerApp/Assets/SmallLogo.png | Bin 0 -> 329 bytes .../GrocerApp/Assets/SplashScreen.png | Bin 0 -> 2146 bytes .../GrocerApp/GrocerApp/Assets/StoreLogo.png | Bin 0 -> 429 bytes .../GrocerApp/GrocerApp/Assets/Thumbs.db | Bin 0 -> 16896 bytes .../GrocerApp/GrocerApp/Assets/tile150.png | Bin 0 -> 1649 bytes .../GrocerApp/GrocerApp/Assets/tile30.png | Bin 0 -> 302 bytes .../GrocerApp/GrocerApp/Assets/tile310.png | Bin 0 -> 2098 bytes .../GrocerApp/GrocerApp/Assets/tile620.png | Bin 0 -> 11439 bytes .../GrocerApp/Common/StandardStyles.xaml | 1837 +++++++++++++++++ .../GrocerApp/GrocerApp/Data/GroceryItem.cs | 31 + .../GrocerApp/GrocerApp/Data/ViewModel.cs | 52 + .../GrocerApp/Flyouts/AddItemFlyout.xaml | 51 + .../GrocerApp/Flyouts/AddItemFlyout.xaml.cs | 29 + .../GrocerApp/Flyouts/FlyoutHelper.cs | 38 + .../GrocerApp/Flyouts/HomeZipCodeFlyout.xaml | 31 + .../Flyouts/HomeZipCodeFlyout.xaml.cs | 20 + .../GrocerApp/GrocerApp/GrocerApp.csproj | 205 ++ .../GrocerApp/GrocerApp/GrocerApp.csproj.user | 6 + .../GrocerApp/GrocerApp_TemporaryKey.pfx | Bin 0 -> 2504 bytes .../GrocerApp/GrocerApp/Package.appxmanifest | 27 + .../GrocerApp/GrocerApp/Pages/DetailPage.xaml | 79 + .../GrocerApp/Pages/DetailPage.xaml.cs | 37 + .../GrocerApp/GrocerApp/Pages/ItemDetail.xaml | 45 + .../GrocerApp/Pages/ItemDetail.xaml.cs | 73 + .../GrocerApp/GrocerApp/Pages/ListPage.xaml | 84 + .../GrocerApp/Pages/ListPage.xaml.cs | 51 + .../GrocerApp/GrocerApp/Pages/MainPage.xaml | 29 + .../GrocerApp/Pages/MainPage.xaml.cs | 125 ++ .../GrocerApp/Pages/NoItemSelected.xaml | 14 + .../GrocerApp/Pages/NoItemSelected.xaml.cs | 34 + .../GrocerApp/Properties/AssemblyInfo.cs | 29 + .../Resources/GrocerResourceDictionary.xaml | 87 + .../LayoutPlaceHolder/LayoutPlaceHolder.sln | 46 + .../LayoutPlaceHolder.v11.suo | Bin 0 -> 29696 bytes .../LayoutPlaceHolder/App.xaml | 20 + .../LayoutPlaceHolder/App.xaml.cs | 59 + .../LayoutPlaceHolder/Assets/Logo.png | Bin 0 -> 801 bytes .../LayoutPlaceHolder/Assets/SmallLogo.png | Bin 0 -> 329 bytes .../LayoutPlaceHolder/Assets/SplashScreen.png | Bin 0 -> 2146 bytes .../LayoutPlaceHolder/Assets/StoreLogo.png | Bin 0 -> 429 bytes .../Common/StandardStyles.xaml | 1829 ++++++++++++++++ .../LayoutPlaceHolder.csproj | 151 ++ .../LayoutPlaceHolder.csproj.user | 6 + .../LayoutPlaceHolder_TemporaryKey.pfx | Bin 0 -> 2504 bytes .../LayoutPlaceHolder/MainPage.xaml | 16 + .../LayoutPlaceHolder/MainPage.xaml.cs | 37 + .../LayoutPlaceHolder/Package.appxmanifest | 42 + .../Properties/AssemblyInfo.cs | 29 + Source Code/Chapter 5/GrocerApp/GrocerApp.sln | 46 + .../Chapter 5/GrocerApp/GrocerApp.v11.suo | Bin 0 -> 165888 bytes .../Chapter 5/GrocerApp/GrocerApp/App.xaml | 21 + .../Chapter 5/GrocerApp/GrocerApp/App.xaml.cs | 106 + .../GrocerApp/GrocerApp/Assets/Logo.png | Bin 0 -> 801 bytes .../GrocerApp/GrocerApp/Assets/SmallLogo.png | Bin 0 -> 329 bytes .../GrocerApp/Assets/SplashScreen.png | Bin 0 -> 2146 bytes .../GrocerApp/GrocerApp/Assets/StoreLogo.png | Bin 0 -> 429 bytes .../GrocerApp/GrocerApp/Assets/Thumbs.db | Bin 0 -> 16896 bytes .../GrocerApp/GrocerApp/Assets/tile150.png | Bin 0 -> 1649 bytes .../GrocerApp/GrocerApp/Assets/tile30.png | Bin 0 -> 302 bytes .../GrocerApp/GrocerApp/Assets/tile310.png | Bin 0 -> 2098 bytes .../GrocerApp/GrocerApp/Assets/tile620.png | Bin 0 -> 11439 bytes .../GrocerApp/Common/StandardStyles.xaml | 1837 +++++++++++++++++ .../GrocerApp/GrocerApp/Data/GroceryItem.cs | 31 + .../GrocerApp/GrocerApp/Data/Location.cs | 27 + .../GrocerApp/GrocerApp/Data/ViewModel.cs | 70 + .../GrocerApp/Flyouts/AddItemFlyout.xaml | 51 + .../GrocerApp/Flyouts/AddItemFlyout.xaml.cs | 29 + .../GrocerApp/Flyouts/FlyoutHelper.cs | 38 + .../GrocerApp/Flyouts/HomeZipCodeFlyout.xaml | 31 + .../Flyouts/HomeZipCodeFlyout.xaml.cs | 20 + .../GrocerApp/GrocerApp/GrocerApp.csproj | 206 ++ .../GrocerApp/GrocerApp/GrocerApp.csproj.user | 6 + .../GrocerApp/GrocerApp_TemporaryKey.pfx | Bin 0 -> 2504 bytes .../GrocerApp/GrocerApp/Package.appxmanifest | 31 + .../GrocerApp/GrocerApp/Pages/DetailPage.xaml | 79 + .../GrocerApp/Pages/DetailPage.xaml.cs | 37 + .../GrocerApp/GrocerApp/Pages/ItemDetail.xaml | 45 + .../GrocerApp/Pages/ItemDetail.xaml.cs | 73 + .../GrocerApp/GrocerApp/Pages/ListPage.xaml | 84 + .../GrocerApp/Pages/ListPage.xaml.cs | 52 + .../GrocerApp/GrocerApp/Pages/MainPage.xaml | 39 + .../GrocerApp/Pages/MainPage.xaml.cs | 100 + .../GrocerApp/Pages/NoItemSelected.xaml | 14 + .../GrocerApp/Pages/NoItemSelected.xaml.cs | 34 + .../GrocerApp/Properties/AssemblyInfo.cs | 29 + .../Resources/GrocerResourceDictionary.xaml | 87 + contributing.md | 14 + 194 files changed, 20895 insertions(+) create mode 100644 9781430250340.jpg create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp.sln create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp.v11.suo create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/App.xaml create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/App.xaml.cs create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/Logo.png create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/SmallLogo.png create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/SplashScreen.png create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/StoreLogo.png create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/Common/StandardStyles.xaml create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp.csproj create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp.csproj.user create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/MainPage.xaml create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/MainPage.xaml.cs create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/Package.appxmanifest create mode 100644 Source Code/Chapter 1/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp.sln create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp.v11.suo create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/App.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/App.xaml.cs create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/Logo.png create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/SmallLogo.png create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/SplashScreen.png create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/StoreLogo.png create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Common/StandardStyles.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Data/GroceryItem.cs create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Data/ViewModel.cs create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp.csproj create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp.csproj.user create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Package.appxmanifest create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ItemDetail.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ListPage.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ListPage.xaml.cs create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml.cs create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/Resources/GrocerResourceDictionary.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/App.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/App.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/AppxManifest.xml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/Logo.png create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/SmallLogo.png create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/SplashScreen.png create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/StoreLogo.png create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Common/StandardStyles.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/GrocerApp.exe create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/GrocerApp.pdb create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/ItemDetail.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/ListPage.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/NoItemSelected.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Resources/GrocerResourceDictionary.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/resources.pri create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/vs.appxrecipe create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppxManifest.xml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Common/StandardStyles.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/GrocerApp.build.appxrecipe create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/GrocerApp.exe create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/GrocerApp.pdb create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/MainPage.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/ItemDetail.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/ListPage.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/NoItemSelected.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Resources/GrocerResourceDictionary.xaml create mode 100644 Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/resources.pri create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp.sln create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp.v11.suo create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/App.xaml create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/App.xaml.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/Logo.png create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/SmallLogo.png create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/SplashScreen.png create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/StoreLogo.png create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/Thumbs.db create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Common/StandardStyles.xaml create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Data/GroceryItem.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Data/ViewModel.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp.csproj create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp.csproj.user create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Package.appxmanifest create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/DetailPage.xaml create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ItemDetail.xaml create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ListPage.xaml create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ListPage.xaml.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/MainPage.xaml create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/MainPage.xaml.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs create mode 100644 Source Code/Chapter 3/GrocerApp/GrocerApp/Resources/GrocerResourceDictionary.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp.sln create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp.v11.suo create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/App.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/App.xaml.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Assets/Logo.png create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Assets/SmallLogo.png create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Assets/SplashScreen.png create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Assets/StoreLogo.png create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Assets/Thumbs.db create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Assets/tile150.png create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Assets/tile30.png create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Assets/tile310.png create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Assets/tile620.png create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Common/StandardStyles.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Data/GroceryItem.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Data/ViewModel.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp.csproj create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp.csproj.user create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Package.appxmanifest create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/DetailPage.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ItemDetail.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ListPage.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ListPage.xaml.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/MainPage.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/MainPage.xaml.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs create mode 100644 Source Code/Chapter 4/GrocerApp/GrocerApp/Resources/GrocerResourceDictionary.xaml create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder.sln create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder.v11.suo create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/App.xaml create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/App.xaml.cs create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/Assets/Logo.png create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/Assets/SmallLogo.png create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/Assets/SplashScreen.png create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/Assets/StoreLogo.png create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/Common/StandardStyles.xaml create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/LayoutPlaceHolder.csproj create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/LayoutPlaceHolder.csproj.user create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/LayoutPlaceHolder_TemporaryKey.pfx create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/MainPage.xaml create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/MainPage.xaml.cs create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/Package.appxmanifest create mode 100644 Source Code/Chapter 4/LayoutPlaceHolder/LayoutPlaceHolder/Properties/AssemblyInfo.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp.sln create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp.v11.suo create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/App.xaml create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/App.xaml.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Assets/Logo.png create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Assets/SmallLogo.png create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Assets/SplashScreen.png create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Assets/StoreLogo.png create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Assets/Thumbs.db create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Assets/tile150.png create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Assets/tile30.png create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Assets/tile310.png create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Assets/tile620.png create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Common/StandardStyles.xaml create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Data/GroceryItem.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Data/Location.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Data/ViewModel.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp.csproj create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp.csproj.user create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Package.appxmanifest create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/DetailPage.xaml create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ItemDetail.xaml create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ListPage.xaml create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ListPage.xaml.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/MainPage.xaml create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/MainPage.xaml.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs create mode 100644 Source Code/Chapter 5/GrocerApp/GrocerApp/Resources/GrocerResourceDictionary.xaml create mode 100644 contributing.md diff --git a/9781430250340.jpg b/9781430250340.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d9b2f6bb7f751baf8269047b539884832656953 GIT binary patch literal 11432 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 F{s+j@_w4`x literal 0 HcmV?d00001 diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..714d53f --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Freeware License, some rights reserved + +Copyright (c) 2012 Adam Freeman + +Permission is hereby granted, free of charge, to anyone obtaining a copy +of this software and associated documentation files (the "Software"), +to work with the Software within the limits of freeware distribution and fair use. +This includes the rights to use, copy, and modify the Software for personal use. +Users are also allowed and encouraged to submit corrections and modifications +to the Software for the benefit of other users. + +It is not allowed to reuse, modify, or redistribute the Software for +commercial use in any way, or for a user’s educational materials such as books +or blog articles without prior permission from the copyright holder. + +The above copyright notice and this permission notice need to be included +in all copies or substantial portions of the software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS OR APRESS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..183f828 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +#Apress Source Code + +This repository accompanies [*Windows 8 Apps Revealed Using XAML and C#*](http://www.apress.com/9781430250340) by Adam Freeman (Apress, 2012). + +![Cover image](9781430250340.jpg) + +Download the files as a zip using the green button, or clone the repository to your machine using Git. + +##Releases + +Release v1.0 corresponds to the code in the published book, without corrections or updates. + +##Contributions + +See the file Contributing.md for more information on how you can contribute to this repository. diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp.sln b/Source Code/Chapter 1/GrocerApp/GrocerApp.sln new file mode 100644 index 0000000..9185511 --- /dev/null +++ b/Source Code/Chapter 1/GrocerApp/GrocerApp.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows 8 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GrocerApp", "GrocerApp\GrocerApp.csproj", "{2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|ARM.ActiveCfg = Debug|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|ARM.Build.0 = Debug|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|ARM.Deploy.0 = Debug|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x64.ActiveCfg = Debug|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x64.Build.0 = Debug|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x64.Deploy.0 = Debug|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x86.ActiveCfg = Debug|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x86.Build.0 = Debug|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x86.Deploy.0 = Debug|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|Any CPU.Build.0 = Release|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|Any CPU.Deploy.0 = Release|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|ARM.ActiveCfg = Release|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|ARM.Build.0 = Release|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|ARM.Deploy.0 = Release|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x64.ActiveCfg = Release|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x64.Build.0 = Release|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x64.Deploy.0 = Release|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x86.ActiveCfg = Release|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x86.Build.0 = Release|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x86.Deploy.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp.v11.suo b/Source Code/Chapter 1/GrocerApp/GrocerApp.v11.suo new file mode 100644 index 0000000000000000000000000000000000000000..7d88d92213a7ce8f1474ffd78994a6a7bcb9582d GIT binary patch literal 32768 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 + + + + + + + + + + + + diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/App.xaml.cs b/Source Code/Chapter 1/GrocerApp/GrocerApp/App.xaml.cs new file mode 100644 index 0000000..cc3e603 --- /dev/null +++ b/Source Code/Chapter 1/GrocerApp/GrocerApp/App.xaml.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; + +namespace GrocerApp { + + sealed partial class App : Application { + + public App() { + this.InitializeComponent(); + this.Suspending += OnSuspending; + } + + protected override void OnLaunched(LaunchActivatedEventArgs args) { + Frame rootFrame = Window.Current.Content as Frame; + + + if (rootFrame == null) { + // Create a Frame to act as the navigation context and navigate to the first page + rootFrame = new Frame(); + + if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { + //TODO: Load state from previously suspended application + } + + // Place the frame in the current Window + Window.Current.Content = rootFrame; + } + + if (rootFrame.Content == null) { + + if (!rootFrame.Navigate(typeof(MainPage), args.Arguments)) { + throw new Exception("Failed to create initial page"); + } + } + // Ensure the current window is active + Window.Current.Activate(); + } + + private void OnSuspending(object sender, SuspendingEventArgs e) { + var deferral = e.SuspendingOperation.GetDeferral(); + //TODO: Save application state and stop any background activity + deferral.Complete(); + } + } +} diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/Logo.png b/Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e26771cb33a49bbef824aa333737181b0a5b09a3 GIT binary patch literal 801 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=1foIEGZ*dUJQLud<^=L*gE#63Ho!PGzwUb%GPK6&5iF zt!p@aGNX}6(PVh|N)M-?0RNcTbjaWgEU8noxUax-n>&3Ay)#!y&O11y2sKEF zt72@XC1)RvT6Xw=y_`Ce)`nGULLL^lI$kwi^E+dQT7YeXY4GvlRR%kj1x$VZi%Bdd zz}2Giy=-_$h+v#(S+};)DuE4EM?_^qB_eDeo@&q%StD1F>L|*0ZC2sb-}llSMTM?O z6{b3iid~yk@VE7q7Wb+P8?H5IYp?pSVcLE~18m#ygK20HL@6W5woI~Fjlw$fX1U{xQA5a+t0 zH$WNIb=fNpWHo}M9#;K6eszDZKty_|-?j4iocj5#zotrWc;@;w`H@=mjsvS2wXX0_ zY}l$4@^sE?UcC)ji*L=Z&}P!xaL&2((OQlj2dv~pV-ifAS;ZsH1{`D!GY%yys5WH)f>ZLo5m%6XjuXdbKMR7MEHSyb{m!_{Afji&MT$_sz7 z>1{~MlIFe28FRN(GC_~;#Jp4ADipP+9hh|P#-&`vO-Upt3jE0@YLh(^55uYWl9g)Z RA3>Rb!PC{xWt~$(69A&hN*MqE literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/SmallLogo.png b/Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb0d9d528c42f132872e8af4dc563081b0b9aff GIT binary patch literal 329 zcmV-P0k-~$P)q$gGRCwC#*X;?zAP@%N+|i#I!$mrh zlQ>KU$Rdu>|JH&931_?y6Djl{gb>4nCV5pzDJ?S!mq|4ZejKj%i@j$H{#ML~2Y{DF z$=}bKPaz+UGt{v(4CTQQXym}&iW8{s!ew~XIE7NLjQpy#I2S$rous$~?f%DHT#B*+ zq=#!zc5=0FEqWFpB%UE(L807on!pidHPLgYO}XEgorrg;PB=8ipgQ5u5`&g_MQaRd zaU7Ao8XQMuuN21-s0PPTs1%38x_Yl3Fs-|Y4!C-;M-8g@n*v@1|s#GQ665=9@Rxy?u0YW0&WN+~=RXpPbVXXL4m7Aq=E6I0%{06TwRn=U9d8>exk> zD-Z%M3DNQ`bTLSEF=%NFyoHcAkD*CiXqljo*0E?o$GiDC4q}}|%*0WghLlK#npw?hecrM}Mw?`E(z5C8< z8&*b^!{>5?4aT89vdrgBgSc-x6JZD3F^l#*G(@OO*^1D%Eu7?HAy<3kTLqW9N{^#6vso zVQwY48q7)m{~xQ64RV7{E7Y=&T~?^05Ky`5oNQ8bLgFCPq9co^R09BVRS1OAmH;hU zC#q(N!gNqm!zU#%sv{r5mm-Uv8b-~a1F-;p^>)pnXfKge4s9?;;MFIr*fixPG}NBA z6_G5BEmeO6XXh(emkciB{7tA;iwC2^s^VzyU_h0@ae84ACMY`cIDEju=<`q|2QAEv zW_)W|i|9aknqdmS=#w73eW_csQ$8IhT^vY1^1;X3&J0{%*tcQq!gJpr3w?TJc~@5= zKV5sM{$3k>b#S$@CTkhIF*{v*u(F&$&Yq1naHxt8Mz2N%7aQ3(^VNRZahk1||7?Bl z*idzO_u)FhRj4cPzDO>YA>>lxAGaciEiX8Xzp1SVPv91};$OG3cC&8!v3{Jq^kH@8 UTIccK;hzT5*3#}uZuEx!0OwrBv;Y7A literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/StoreLogo.png b/Source Code/Chapter 1/GrocerApp/GrocerApp/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb672712c6823a0c91548ded70a8acb85536b4d GIT binary patch literal 429 zcmV;e0aE^nP)NtYJa1l)bQ5qwGXpZbs7%2oRMd4y35$s&66(fxhNg8W02!vSn zdlrL2h^Fx+3=$z;kK{0D#MyeJ8WRWZcLSf(PcQ_mLOhrmC}O-tX^0c>5`YvCUZVsc zG-6#78ubjJ5nA;OX&^K(q=i6ZNE3m?kTwE^AqxZoLskfB3|S&1F=UO9!cY$g2@Lgu z;9{sJ1P9|X2L`r1#Gs8R{E^$PRrMaC86q| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mouse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp.csproj b/Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp.csproj new file mode 100644 index 0000000..465beb4 --- /dev/null +++ b/Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp.csproj @@ -0,0 +1,151 @@ + + + + + Debug + AnyCPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2} + AppContainerExe + Properties + GrocerApp + GrocerApp + en-US + 512 + {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + GrocerApp_TemporaryKey.pfx + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE + prompt + 4 + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + ARM + false + prompt + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x64 + false + prompt + true + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x86 + false + prompt + true + + + + + + + App.xaml + + + MainPage.xaml + + + + + + Designer + + + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + 11.0 + + + + \ No newline at end of file diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp.csproj.user b/Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp.csproj.user new file mode 100644 index 0000000..b29230c --- /dev/null +++ b/Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp.csproj.user @@ -0,0 +1,6 @@ + + + + True + + \ No newline at end of file diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx b/Source Code/Chapter 1/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..27d6028a1b1fd721c26a8556804215fc7efbcf2e GIT binary patch literal 2504 zcmY+E2{hDe8^Hgw&txfEF_EQw#YnB+vKG_G8eHpvLq_Q<6OI;DJBx^>p zlx%ZJE(Te$R}w||rq1`>d+vG9^FGh>dzSY-?>X;-p`c!ZK@bcD6$eL2Ctpb3;Q%2( z#S~N!l!EeOVIqbC+x=GvwhE=dKCti{OQzv$|Epp@0su)8-br)F+!EM|SfhY@z(D}!VAO3)28?rQ*`x1J^Abcs zc1%2%c@ua-=7=gkVN|gy6ILx3xp8whRe`LBj9W^ikt5FdnkKec+ZkB|B*C=tjX8ga zL-%o<8u(*PjvK#U*QEGJWXD$3&pxpkQ-3pDvAV8=`7@eW=hCo6e#k|}7PJ$7)3SP- z`Mi=Kw=GZ*AX)z5ThMzAm@+W1&|B5+9Co*V^(7h`)v9aX zGj+w_tvmP0;s(Hd3G{xBm>cj`dVTxQf$h!bveIhfULVScA)f}w;l`)F_4g>nG_PIN zFNuprR`Y>_wQ*0Sc=Xbm3{CrMII7DTW8b{^VKWPk8tkOa-*_N4CyXSQ4bY7r`U*Rx z?T^;g(9aRhq9?_N^K|Gb+*S;G0aE%9T#xD+wIrF*tO6@OV>5>&pDc8msiA%^gN#7s z+4z`R32tHPDkdUj^MS3<7cC?a3qQW~WY8 z-iFx8EyL|JC;zY#exS6+E8B?3L5_O5d z-F~d&{!u#!ws?{TfWhh)sm0geVf$R8U))a>FiU>q8);20c#pLUzFM{)f4EUA;6H&# zZxd#oyQiRAs`w!n=eS4b)GSpS-&SU;1X5ssbqYS;O7QX!8+_H43a#_fYGa55szi?znHp`FbjW+o4urPCGp68to9*o+Sl}{Ze zvhleZvtYAlxVYu0bPgx``jGC#B~jL^DRga`TG`)My`Jrv*>S`W;e9M?Eo4g|wA(3` zT_Jc?xE%a&BGktRK;K9P@O-WukmyoH$iS_p_ON=Z{E% z)g8v_Go{Kc(yb)+RJ#{g|K9M3KpwH^Z$g`2a(kjnLmC-k*4`ie6ot$tRS1vG<4n{g z^K7H=j|Rxt_|2Oa3GMy0$4tY)ieAcEc$U0{QKg=!+Zo;wPABMrbpkc|$Q@`QcH#I#KofrRF^< z%KdfQWg7C%tOQ5SInYd1Vd)f~pPatD0FpSdTL(9C!-F_XJr_8tHOZs*rqZoQ3htEM@U z>L5*85*KI%lVuFVxD2NZJ!n|sC<@g18_h$_kT zoT7~kTJKMr=si0@L(8TDMfK0C;~vNN4_H_D`X{T~ZXSA%f`mRAG34gFokt?$CiD_q z@6#}97-0+o4wK=8fYDIit{4#U + + + + + + + + diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/MainPage.xaml.cs b/Source Code/Chapter 1/GrocerApp/GrocerApp/MainPage.xaml.cs new file mode 100644 index 0000000..b362acf --- /dev/null +++ b/Source Code/Chapter 1/GrocerApp/GrocerApp/MainPage.xaml.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; + + +namespace GrocerApp { + public sealed partial class MainPage : Page { + public MainPage() { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) { + } + + private void ButtonClick(object sender, RoutedEventArgs e) { + + FirstButton.Content = "Pressed"; + FirstButton.FontSize = 50; + + System.Diagnostics.Debug.WriteLine("Button Clicked: " + + ((Button)e.OriginalSource).Content); + } + + } +} diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/Package.appxmanifest b/Source Code/Chapter 1/GrocerApp/GrocerApp/Package.appxmanifest new file mode 100644 index 0000000..518710a --- /dev/null +++ b/Source Code/Chapter 1/GrocerApp/GrocerApp/Package.appxmanifest @@ -0,0 +1,42 @@ + + + + + + + GrocerApp + adam + Assets\StoreLogo.png + + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 1/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs b/Source Code/Chapter 1/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f2e348e --- /dev/null +++ b/Source Code/Chapter 1/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GrocerApp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GrocerApp")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp.sln b/Source Code/Chapter 2/GrocerApp/GrocerApp.sln new file mode 100644 index 0000000..9185511 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows 8 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GrocerApp", "GrocerApp\GrocerApp.csproj", "{2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|ARM.ActiveCfg = Debug|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|ARM.Build.0 = Debug|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|ARM.Deploy.0 = Debug|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x64.ActiveCfg = Debug|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x64.Build.0 = Debug|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x64.Deploy.0 = Debug|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x86.ActiveCfg = Debug|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x86.Build.0 = Debug|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x86.Deploy.0 = Debug|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|Any CPU.Build.0 = Release|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|Any CPU.Deploy.0 = Release|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|ARM.ActiveCfg = Release|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|ARM.Build.0 = Release|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|ARM.Deploy.0 = Release|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x64.ActiveCfg = Release|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x64.Build.0 = Release|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x64.Deploy.0 = Release|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x86.ActiveCfg = Release|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x86.Build.0 = Release|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x86.Deploy.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp.v11.suo b/Source Code/Chapter 2/GrocerApp/GrocerApp.v11.suo new file mode 100644 index 0000000000000000000000000000000000000000..fdda48b19c13622468764bed5e95f782668157b4 GIT binary patch literal 95744 zcmeHw37i{8m40h%%Ol$%8XvKBjWdbIGZ~GK5QRyP)S8j43mvv6 zu^}N@*Z|87%S|?939!qN1;Q=_$S!}*K+TqxqND%gd%P{6q?%#xIbk8_1pbM!`&=y z=OfnkE0w5Y$gwEw7lx602BElcxMLcv56?vl)K+!tbG_?7;HFyE2|*Mp!U18Ykj1$w z?8dKzGO70~dI@OmT`Kfho{H-=0G31ZsBQ2wc+y{gx)=EtgfuWeB#fXe1;Dgi0;e!0 zKP%uWEexSdqL4?pxkLfvzYb}w0vOHz(}>G=c<{YHYby}pGjLD6#lFqs65Lb6#CI*= z$pGU01i(1};`EOI##@gw>-bE79q?BGHJ^(Rz8DY$Tncy+;9LOnIjeqV_*jo^UDDc) z=V3qu5Cy~laljB@2jD8eFyLyyHGrLf5x_3MC}0e5Enpmw089XO1NH#+0`>u}13VjW zJs=6V0q`8aB;ZDX2$%w-0BL{($N;7RGk`2$Ki~i$2gm~ofFhs-crKs}V5_JCYJh`) zLjd+9_U4-aHv^6Ujsl(scs}43z=`btkG%DVjsCwCnd3Ma{r|Vf_jLc4tADPat9*cc zm;GPc-&f;W?Ta>q+5dUX{!jTpeYO%|_J3Zl!@1Y~&%B?eNl#68q36^6zkC0`74^+} zzYXWx0p!y!1iT2q`-B%G{1VOe%MgA!;1z&Z0$v4pHQ+UX*8*M#_*($qeFM&K1iT6G zX24qjZw0&!a3|oyfV%*12iy(dJMX~x9>6;R@2cPX2b|fq-c!GRAI|Rw+*`l?0L~u- zdkp0>UcJYPy}ye}jiF?Nee9$0_7CU6;D{VnnV2`x)G?bV{WD%#Qq@ zjPN-CqxioRanG*5-?q_6Z)Nz`crEWgRQ^ zoWM2ffb`GGvV{^;{}=M_T-_VRe+80yn1c+C2(T;y+dT3tnzvE>S>FD7{zH&J2XkRRWM^X-7sl^xACG*2>H+Pexvz6h;+`Y^Pg_{hjjAP-Xj0E;|7N_qxt^?asLG1(JlX= z60Pko^WT7{%$rBsh?)lvA>3~O|I_3D>GA(~kN@4;KV_g!$3pu5Z;>E*ioe$W z(Te{F@XgB_=xmcsq@5nRq2B)2_mKZBh&ut`(Y^n7mH&j3EdTY)e;x$hr{zDH{Fsv( zgXM)YjunJeD~Ni}32wky$DH6qPsGgVr`|Pr!5!OP5PRkOZP}lGp326Yqim!))1ymlG0dm&SJzcdkg2Ri-H|CLs~0oJEM&- zjXNHI1F#P^mJ#5VY~m_**jtK-C*gh+Rv%I3d9;J_%_L?3nJ)QH8Sj_yr+-haE0$*% zrD6YNucj4^_R2;bZlBz6*AMM`Ui|s%AG>?g)4dM8+UwQ+_p-iYtH0f-*BtOduEmNCT=QLW1 zQXerqBNaOx3mJbmBf)$<(dPP|Kq+d#x;p0%QASLbLK%zam&A39_1~TUpO*jT*Lvd) z<&Tpr|H*V#Et4yDhJmOa@$HqTTe*Gz9Q)865<;I)YG?0}~NE&)6ZKppDo0Ls#oDcP@RS9~UbGmx}% zv7I{s8v)deXdR%0N-H5XHF7K3ENC~Q?T-56CIE5VQa@jb^ESYCKo}4KL;*2C954jf z0k{e<47eI_4PYl=1h5M*3K#=i3m69^0Fu}13VjWJs=6V0q`8aB;ZDX z2$%w-0BL|qi)n;s09n9(zySa?kvyOPC<01==K{(Aj+9kE4R8=}2yhrM3%ChzGvEl| zDByVjH6O}8MWjldqks}BGfW%>IUh$otco-!QB^dO%unC--HTq~dgmv;`q*dx<84>| z`4dQRUT<{DQjjvYdIV(&fId$6HgUvNW>_Og_Zv&H|GC@9dU`TpYyVUD)%uTqaQiPE zuY35>kG|lnyFU05cAt4Qv>WwtviZ-qZ+PcF4!q&EU)4Mte)vyM`u_R)@~3uoo|rTa zAI3lO0`_gP;>MHqq37cfc?%C!{-NEWg!aI>S4!OTXF8Smt-qXqB!3`}F`EBY#QhN& z8xH16nZ1nGPt8H~F{sRyOp%1yOQ?aUdWiBid5dCyB7ZZQKl`5geyfI~t?4o3NuLZ= z`ePq&Js|(d<3IVW(fnV7xEGS~;^-#-k)L)tSpVeRwGH{$-Oo@lrHIkt2<7Gi&VFB1G+J<)FYb4=@WEF}MbLW0(M{da1As!py- zXnN&vqW&o>tN<9Te{K7xoiB$`OKsyyKg*!iPvb6qp4BIMxl<YdwQT(AT?ycT@KAFMLlAh6X|~z zo>A5^n!mRGA6b&)@A0v}C?oTm?fdS&T@=3X(AzFv*MI)iUt`6x=ClXz89N>}dHtPy z{e^Zrt%^oFnpVzgea=~F+NKnX2&L3njb!@#?1#?zz`dJ(`j=1tYU`CN|DIy^JnDWC z_tg2HpO~C}M(ww6zEC{-i=R65pYDqvO|Skz<+W)5bf2l!jS>j7^7 zybLzXRL_cst;30P}wb&i4Q)r@afnvF#rK9An=Jp#1bc!21FB z0w~XX0PsP;hXD5hJ`DJ0z`p>P=IKMf29ACHLtp>>=oPuAK1+1G^^G5V)Az;a?IwBV z@nPQkf$90LDjg^1B)AdCw5(Tk*6e-nd1d7Z6W%9pe*A4u`DWk$1oY}c^*`6wzxjs# z(W<}e$7;UIKK+sUtw=O6_U4b@=iD~%tI-c6KJ;?y=kNc`6gu>dNFqwx(o*ECy-0^z zNkVO@oXIRfZs5ApYhL}tOMj0wsRvI1T%GdV5^Wus`|f?~yMZ;RAAJHa=X|AVsS9Hq zn#C9##b~s<-bxg^a0c(^@JCxi43?7!p6?Jg!|pi_J8BenHp4a=$Mq0wpOd&ViYIY7 z4UW^BVXY0yBf1*$;GRbw>qBy^#~-IIsn8~mbG4x;$}Q3 zbt~ndjfEpeQP%J{m#pI0EMKavLV5cfyunqtvq--Le7z{&6vpN%u9!mxP?kfq)*36% zN;ziZCx)QXue8=4Wj>p-En6lf;tXC<7DckSB9j<{^YyrwzXk{JHq>OU_ zb?HJ|^aHqN!UwIL>nMCO?YszuKzp__hK3L?jO!?3dk`ar8uMsMM*Dszo~N{y2G8eQ zaSA2Pq1M#0Cy}1g4`@+ftJ#3Dff&%5$5y+wPB}kfw$@e{bfHf}R_>9sIMVV?p2eCw z3*~F%uG$P*M;yj{vP_?bZ->5bf>tW%PWSo#AHT75s;yS*65E!#;zw!kCtv^6w)Y8kI4VnDY7u0(Aig^qIG2(-q$-QM^l#NakA$> z8eCD?bwFSK(DEsz-0JUAu>U_Dg*k2iSK6RTmrm!`;Gt^&H@5zaBl-yVB1hgzQ_|Rf zqN(jSJ?wCyj)}^=4|ycV423&7AT#*EtE1q|VfoxXA+CSa^04+X8&BSYV3DE$j(r$y za`M7zSNAZ@{aabwZET>n=FU+S-bG-`C!ie+&DwIk@|h)FVCMp z6W2!br_L>J)`Qc@=f927Oe?FODF2Un`cuQ{PZ2Ydb=NS(5m3EH;j=Mm{vAt7HbBvJ zOBv?1PK;^9ZFOR#V=NxRzot}7TPy!Mhtyc=nM~x^kM&4mq^_xC>$Cn`eO*ICR7 z2T-gj%E(7Sjq70Spn_uY;@s%vb)J0%?`BUt5{SeHqYk&rJLK>U#p8~M*Y9;i{GlONAR3ND zhdf7*>?jvgQaM~ICFerURHald?mv>+l&n>xawRFI#e6bdOx5yIp;}2!6^jQd$-Go8 z7wu)~pd{v`wB2KO*bj^OT(VNEl~a;ERZL6C)QniFN@cq{IW1=+BAZ4iFJ=oRaawZn zJ!E?1$jzaMH{`*eBj9m)9By~a?FfZ}E{6-pP$=jR4#rUC@0k-t;5X!Uhoe#8=Ot>s zXvpOVdwmhdkT32UjCo^0zc+gHA=99jD(3UWLb6g73u&>Ou2g4pQbi`GQCz=k8eGwK zH4QZ!hz5PWaLD0``@-m4(Eu81Anb4je4dck<@W`GzN6nV9dbs=_H8p_mT|kqR7&oA zX>`66I-ltEO*t|?$u*evrqTIQM~^IH)c)HvRBIX<&?t?OZn@+43)9fA}9JipXk65{Ud> z?YibecBYt@ZpxM@(AV*%ylzxdh?TrQR?&i#revSU+nx2%bTsfonqG?9p`iQpCc-fSUck4XoU2}S*g zQvHb5)eqNTvMJf*{z?+ah_zf5IRFzwYDdJ8nAqf|W+jEDT!D<=;|Qc(ZfGfKk3$rL zX=o`amoGCo=<@o!MB$epe(MbNC}JC}I)F`;mCa?+8L-MEiEdqi!IcK$DcN zl5!=foYaKXDu}98AS+`%SAoZ`O|&Uo5>p4Lg+ahQoEHn(j8v(jPJA(6&>cWoUBO7e z;R^%ZaLA8RdqS~5*c11J!``E@Wv+_VS+eF7n`2u`Ucc@*2piHwHF(#9u~T4dYQ_3I zLEf5IbDKUnJYvgN!&4B{{>GNIuCB$D;rT@0RFAR_XFaoG{qe~;(HkuYd*HBa1*S(~ zO1|d0yButf8C)x#{wLZp*{)=?cUBjzvQ$5mg(gVho9hvlq8D7d6)0L}&^k78X(XE}7c0d~)ww5IsfoEnwU*8nof8ldAaSLOhc?*vz(SlY7Ph+GP8a_+ z*rSlEYGr9_L8?{DVs3+dtTvU)rmm4@CyEE8!qzF5H{;I)p$4Y?F3~Hl6Y%fMvDa~9=V)Uc8=Ey38`Am7N#pPu_~@Y0%xHXq{E|`onoaL z&q*|ppOr7yqA-lYCORP!QvL04s+v70U3p+~G6LBP$qi+tT>6qN zNS`$u&H&FyEt^ZXM!9&)gjk-Is$)5^nkkm^t;ez+- z#t%!WS`}neQzl7NCTCMR*Q)~UZ zZQNK%%}9B%;>^$WBM4<14`mCP!y7#=S70Mmsg0$wR6)ZLNdTrYbG(tjbdPMyUc4gb zk9Uzrpr4PalSPYHZl=V8gSyK4oooaA8Uq|+;x|KCN%>N4cFU8TUmsLM{ zYYXU$-*DMeym{K~b2E)uQq|+WwoL0o@!Qi5ufd?`Px)b0@nT{lGk(f_JWeWc!3 z;?ITbfpJPr??(4AcbJYy^gq_AP+A-oq3d=k$q6Oh^)m5n9QL_<%f|6^C9jquiBK$I zwJbf5(aO@pqo*R#R{ja2&MApGTjq)b((Ec(n6#|8KxeF-<8oFC>tUllG2^4r_;`41 zEV)AsIkCQWeDrD?-Tf_pM3uAJt=#?U-Iilc^$3NhM0`Av49CJF$=GOg_egx#L?Rg( z9la)z9EneikJ`uMd*b1p@tEvsqX?~|yT_w(dvr7wPe!i_k4?nK;b}8hWK9UDIQfc= zyJcB^rxu@*_WMjw{E_hRuCefrxPpT$sy(XWz-6!Zn*fLC=*Y{#9bjAMv!mtfX?R}x4__PF7G$Z`$ioGf2HWTdZec4UK8(Qdnl-#_4d=Sn`J7|dQ=9Z9O-Y_z zEat6GK?!a<>6I~2EDf+>$aLh!gX=GMdjo+D_Fy1%g?+o-?F;o=@4Dl%H_ilZeW0Js zfyefK>ji(j=e9>KDLgR17R9z_y%0ZVCrXeJS>4Xz%4i{xDoawqdJ&$S+jx?gDISuq zU}CXejA!RGo{g5XsupgwHzzn&&gP-0O^8$0r#2@zCc)bgx;rM&_E|5%v-27Wa?UbZ zt5h+gd6Sg3KCSJW*A1{+5EFdQ2miK95wvkVWdGVvK6d#w-X*i%Hoz_-_cmf|BXTxk zVYBmxMYFLCHfA-zo-~)H#pd7xCw}_Zo`3IVq-m+A$zEkNO?JMyGzD9LX_5!DlyhAO z_x9Ggh+-+MIEP@d(wOc#E3_S?;#I62yI$f>4GAe0Htb9+5090s)V1|@chs_JR%_p+ z*f%-VH<{|2O!rMneUq8K$?3kynZC(v-{k(j$pd_|e)O+i-B&+W+;i>0A6vh={$(E% z?)==Dmpx=*4YO=KEUal}*4G+~bv74^b;nq(X|Y(n98P#&sF9*RJzc z*Lc$ty|GWfR_o_Tqrb9^YwKTl3e-{OweYR2<~7T-Mz~(;*mtLEt*yn{|00gLx-fv> z3k}LE-CPK9zYDJHh+u^W_r&1pw?KW32jAds8C);NRd9ZJWk;j;bDS`?BA5LD8wD*( zUa@#oSFMN~cC{R+bMKmOm4yJlENfcjv0C1H%QD4POaJ*h>>Mv1;RhG+qSuSy0qpx+ z{BiXc&r=9xaQ5KOja5S;-sIO=M0wqi+Lm8%3ecy$grJp`UbIYWqSv_+ zZJiuhrggFpy?}d#Okhtc?s(PM)k@2|ZeOO@Yk61au}fPU{L;j7*Cq5hIeBF)zH^vT zQfaOhjIQgX{GseL$Gy+E^@tsEo_1F?b+5JgD?s&kifi4GOx-)q58tl@S~Pcq?hnnr&O<>gQx@cP~xxMC#`~=B%159d+nI5uQcP=sl9Z^{jjN9 zMrX?JhP2?sUSsOFG`rV^xmtokd9^2KccbJJWy~O_;7uF=JJR`M0qquqG0e)?Qy8;qd%1Gq(Z7Q58 z(H8J!Igaw&gO?H=B_i%;-o5uunF`lk7^5leP|i^(+a1HSsW8-+XuD&XGZ~i6vdBUu z_LQlxp1?OEsf+RJ&Fr((y}MI(d2rwfaAaz##`KP)spvY4o%4-Ql6xbXXDn@uD|);B z8lz)l9>grxgyz{pC$z%m8AX2khu@x5_TM%_b#wJ!RX$eEtvVt{UL!c?P1VxdNsauz zJHIz?oL8Gma@+xatl9uuEk@nPr5RJvxWUb?g$&7dJPX?Lix;$=b;s6haxy(-ocJa- zzfMsygrT|G?gZ#YD=)3Rv~%+tPR9GGWU971igvmm`10EpTCKi&t2NhLMymz3vz4wp z_U0Oe+FRvf;8^_HHe0+AUL~5UbvIMl2!7@oc{*F>y0_x8si>)^<4$0tt;nBGSeT8< zoDy`a?A)-tE{8Tge* zN?Y&U6U1D$OO>v)-qG4leSfdq%N2hRBV5f~`ml=eKFoDCf56HJuIA$4q-sXiho})N z9$u=)8|kaq1-kcXbG7OAeR?l&o-!n7nTv}xY&@j+G_>FxdUIL!?t3hRYA{n7> zc8RyxW`FB$_KogTH!q|zO{uj9bf>ks?C&b) zQqJmk>xWSX{2qK6_0XFQ%UrW8Y|(lvDY{eHT=w?fTd}$9ukGdJUS>m=x@Vc5{WXd; z4l}ZZY;4BYTt57&eNx}UIWB*@kRy^}d6uB{a}5?bxG^i&b4(?N^r91(OV4fPPYdz+ zHJ5F+J;&-k_AIA9tnOs7@YM?DvTwAubV^!^eNunDTKCpqE*?gXPAiTP&0)FtawxL( z1jZy|W3<_3|5fYje6Otd0$1glYc5sQp%yyNVy=-(#g_Kj=gNMSTygAMQxVd>O0`CB2e z`w+`7a8pP%w!Lm^u(y;z`8KvPUf5Cc68ru#{I=#8AHFqFF9=zO1Jq zYrnQW-$Ti)b0_AqGPbj`Dcnha$CBk_Ni^5252=y|uhqA@bk@{PJ>7Jv^Tg)4tj@Gm zw9Vy2Lt{2VbL-INlB#>3T{PERL_7TE??oLrw zZ?vabC(Yhma%p=U`J|a^no*l*k6-iNKIWSFZ0z4Ne>IRorBh>dlezdwgKD&$8Qpbh zsjq5iwqNM&;-a)jbNNT<;i27a*POj<{#SCeIJNVlFqaLtSz}XIz?#c%qFIAB*9@sz z_J%i$8RZ5Q3v%jC`&^n!3sJFBq$2$<+A7pCmpr86)qamobJ9t{tCd<@>#6d!voX8T z%<<;0236Lv_RovSJKAFm7rm|VY|i=kubs7^guQd}6J5&Y{In~4xstaT647`x!HPe9 zoYWeiZ$etI3m$+2un&72jR-sCufiAQHQmbB=ee?ryB>4>H+O_8VP!Y_qg`<0-VTJg zM=d{| zC^L5>XDRIR3_ZU{&VAR96+2HGO!P3O9LcY^v24R~{p98E#PS=tS(Ify-e&^$hfg8A z1>p(6_(!J4Slw4BDSx3t!d?d2uP7;PdNnZp-IBz#mmaIE=***E70{{^Xx02$VH&?> z{PKEM?q&3hQG2x@a0i8-ElJ#a>CX)+YkT|bT;Fzr0(Vj|f4@{)CCAzJEmaWK0o&g$NhAta z#C}rT=|?HUFCgZzRU%o7aF!NFrS-1SyZI$cO4x)dsp+aZX>@Wq1d9xP0K2jqR8VV`(tSz*J?_ayWw_RaYQgP$xb zTyu5xLZxP-xBX^W;aLEeROw2imcF?5b<^X_QAj(=uy=mN^jIn5U!!f_EsybvvGM`a zV@Ek?`O#>%B8mxDxrF9F$J}-2Q1e?ZBqs=BKDV({mMT)ADps?_f_zi+(@CV%MAHqf z$K4SKdpR)uY~8+AMws8{rng-Y-)R?wtpfD|LD&o#SP*W8wLT6RGysSTgF+ORdpGd& z3PT9_@EgaU15dr!3)L%!{MglX2yp_49mbO=t~|m~2s&w4FBQ9RvuC!A( z$5G3sd_$gb`-RIExon$}>SAL{&4X;1-;b7rBd}S9P$$hYJ@pE%m~G&HBFYia)o)I8 zIl?+R&iwiaA9uQNAIMq3j&?dG?CwgR&5K^1#(ru>+sN@QgOT=ee9K_0ZEQQPwCJr} zDBLm(PDh>?L=TIDQ<5_>OwQ=WUkrTF0j|hrVT3pagaJ|TRu|snUlg&8a!Xn(!gYHF zmGdYp2J|Z-kECTz+qRnV*(^l7ey=0q4-L5j(QqU>M%yw zWTjXurzCr-n3j^M8L?EA%63n3T25R&;ra=?ZvD|$t^=_(O zr?V+a%wl=Aryl!5(;%+&*rs-Dl)67R8Ipw}n{h?TNvW!o?unk?H4Uoj*wO>jeb6+> zrNye4JeZXZ~Vx$-k@X99rOfTgMmQU7e9Jrga$3e2$s}@A$iKyu<2f`VX4ZDSS~f$!t!Fa zU}s8DyAWZ&y6(2I2`cN$Dyn zSCYy}O<1jhs9FWGwYTRg@c6ZfHib)K>Hv*{5SI?;#X>eCRjQ~HU(6SD2T)d5FcNV1 z!az41@}tzAP%IGk#697#_h{_YG5TUgq3JkJu)xoouHMSA;ep|LC}ti#USGu>GGgvm z@ot=BW*elN?1?>a^9IUFNNEb%yIx#y4OVRVj^J8!m2hlskX!O|TgJ@+3+)T1$lQre zD>#J=?mE~nYa4tkzVjKM;>rcacM6#6yVnLCBY2odA~*)izJhDxcYf=*xc-n!#u}1S z z%mw#k?Yib5u7}~36UX@={C0TFB@;Qg<7aR!2(MT|B}>68l-`+|zleVvduu zm~gK+uM#UWRdFgOaUJ@aokcM{B&Mpx^6EYC%t4I)Xfax##5s0poOOO{5msdBMW%v7CwvXz>cOH^y=Y|%LZ4HgE0bn(yzdz}tj z-EOCge;e#ksQtCFw6!4Bs%0^^!9G@-%4Jia!bI_aRM*y3* z>Y9~vxBy?OjF^%ti;?RpV!EY!uF+xvb}=-_vU9vvNJ!OcwlH0ZVG5eN1Du6gkPeS# zc8Zm1JSWjX?5upbhDHfZKRqEGuI_|y(4||3D?{0wRDU~+wtY~#^1$R|1f~HbHD<9VtHDsj^)H^rdZCmKIantmHie=xI0?$!&RwJ$xdZ+ z+3Kt_eppJ?*x}TaNfMQJ+LX?<>VMHZjy+{o`|5-2jFXc>zv2%r2#FV0x8)*{$0 zMacGa{PeH=$f0)t8D{ko9tw#7%#(GU%n)+WET%a60BPa zwOsB>VQ{8eEp6Jkv67mR@?yoApKIl*Vt(VHY$0=aqsQe6Y@{7-p38i#Z6}hAWwPni zKCbl(RJ;{+>}H;Z)1f9bCVS5fgA>LY-gApr{>q6dKifSqS>)P(QF|V?NYy_+=L4p+ zC-pkk>;txV1erZC1ld(&lTrtTMJ5XcPIc&D&GdRa66H=D3qP1Qce}W0@#@m8>5>i3 zLe5?+BokGzcd?vKRA+NiWsxg0f4q?x!CcI7=$kXgyWES<%+(@)$FdY9zs1>&;ahM2 z?2C6i?D%u-+}uZ|pY!Uw*~=*EX^-EU9DijifW_R??aWPyZ%n`TJkP%$y?R^to8Nnj zUad9uZ}`5+>yJCnwcE`@*(>QCuf6Lb>o=TVyXar{i>22bczx&kNaJy1-C6gQB=toW ztnugD? zdJ_za{*)h+u3mU7h6ZogpeC-X*Dh{eH&Bjl(Tz2#@EK6TWJP#P%$6$ni?S=zh=>6kS^?-{?NB6?Q}aW1R}6#bG&-?)n=j1KFr{aXGDx>d;DFEkzQcSi)*q zdt*mq!B;$bDiUqwpD>J`l9;n)t~emgu9B5`%Ze6@TC?@eN@Gdb=$gE?D+O)b3d!kpH=6Y=pxGQ80BhtaFTV-xXlJCug`g->G9qmxDe8~cgncWUuz z(s-Ws-VJLA!b zcuXP3Q;5%xRD5WU{jh29AvUr2M0j|of(s4FD>=4w9KbRs;95jHRao0v`n2O~HcfppV} zu#pkyDKWqrp_E{CoeP2b&CQlZg~m%{^GBI2kTir;0EaP83U44@!a=yMx)3 zG+L4;In_y}N!2(j&)Ct$?G=ky;!cwdI<{e*((jZqRV!UCI!q+?Y=mD}Mao6-qbPTr zpc-nL&d{kFQZ|6{y!-@}#~8&}svt@wOSp}_EEa5L!8BWM^m=x&n74*df)}5ldg(?d zHk<)F3Pi5ZZ@u7;_uTf#C4~p9gScFOx!W5EY_JCdp)2g$?QUPFpUg!Nw(s8FZ@ue| z%icH>xb=a4>%^A|5AJ>16z-k-kJc(xEC{$sN?W(%siv62mC-^XRhFc}07ndY z)-{ZPG81d#up`gQsuQ#pVSuBD9FG{=h@6dB*jQd03ua>pY}@fOz(Gcido=>}G_PUM zV(DLd{=J(q>1#py0~~OSrg@nfH_=FQLQYdNk&HB-QIBWkK5M!tTle5eyDHv`XKg66 zuQ@>tsjq8Ju!%0u#W$lm>7K@F3NVXezz4qf1m&sK~C3D*V2VJ=q ziLs5y*@%UW<+ZVBHkQH0tOhtX&!vf}bw0@8r*$r#?{y8dM!{zM}y_zVPQ`t;(aY8wp@doOqhp- zeUGtP@v^Wd&c$L&ox5O*)lHafZ!Q+wpl-r!O>?o>s&r$qeayvTJJHSY7HzCs+r%QZ KPajLE2L2DF?gsb( literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/App.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/App.xaml new file mode 100644 index 0000000..fc45fa5 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/App.xaml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/App.xaml.cs b/Source Code/Chapter 2/GrocerApp/GrocerApp/App.xaml.cs new file mode 100644 index 0000000..4011f65 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/App.xaml.cs @@ -0,0 +1,48 @@ +using System; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace GrocerApp { + + sealed partial class App : Application { + + public App() { + this.InitializeComponent(); + this.Suspending += OnSuspending; + } + + protected override void OnLaunched(LaunchActivatedEventArgs args) { + Frame rootFrame = Window.Current.Content as Frame; + + + if (rootFrame == null) { + // Create a Frame to act as the navigation context and navigate to the first page + rootFrame = new Frame(); + + if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { + //TODO: Load state from previously suspended application + } + + // Place the frame in the current Window + Window.Current.Content = rootFrame; + } + + if (rootFrame.Content == null) { + + if (!rootFrame.Navigate(typeof(Pages.ListPage), args.Arguments)) { + throw new Exception("Failed to create initial page"); + } + } + // Ensure the current window is active + Window.Current.Activate(); + } + + private void OnSuspending(object sender, SuspendingEventArgs e) { + var deferral = e.SuspendingOperation.GetDeferral(); + //TODO: Save application state and stop any background activity + deferral.Complete(); + } + } +} diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/Logo.png b/Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e26771cb33a49bbef824aa333737181b0a5b09a3 GIT binary patch literal 801 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=1foIEGZ*dUJQLud<^=L*gE#63Ho!PGzwUb%GPK6&5iF zt!p@aGNX}6(PVh|N)M-?0RNcTbjaWgEU8noxUax-n>&3Ay)#!y&O11y2sKEF zt72@XC1)RvT6Xw=y_`Ce)`nGULLL^lI$kwi^E+dQT7YeXY4GvlRR%kj1x$VZi%Bdd zz}2Giy=-_$h+v#(S+};)DuE4EM?_^qB_eDeo@&q%StD1F>L|*0ZC2sb-}llSMTM?O z6{b3iid~yk@VE7q7Wb+P8?H5IYp?pSVcLE~18m#ygK20HL@6W5woI~Fjlw$fX1U{xQA5a+t0 zH$WNIb=fNpWHo}M9#;K6eszDZKty_|-?j4iocj5#zotrWc;@;w`H@=mjsvS2wXX0_ zY}l$4@^sE?UcC)ji*L=Z&}P!xaL&2((OQlj2dv~pV-ifAS;ZsH1{`D!GY%yys5WH)f>ZLo5m%6XjuXdbKMR7MEHSyb{m!_{Afji&MT$_sz7 z>1{~MlIFe28FRN(GC_~;#Jp4ADipP+9hh|P#-&`vO-Upt3jE0@YLh(^55uYWl9g)Z RA3>Rb!PC{xWt~$(69A&hN*MqE literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/SmallLogo.png b/Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb0d9d528c42f132872e8af4dc563081b0b9aff GIT binary patch literal 329 zcmV-P0k-~$P)q$gGRCwC#*X;?zAP@%N+|i#I!$mrh zlQ>KU$Rdu>|JH&931_?y6Djl{gb>4nCV5pzDJ?S!mq|4ZejKj%i@j$H{#ML~2Y{DF z$=}bKPaz+UGt{v(4CTQQXym}&iW8{s!ew~XIE7NLjQpy#I2S$rous$~?f%DHT#B*+ zq=#!zc5=0FEqWFpB%UE(L807on!pidHPLgYO}XEgorrg;PB=8ipgQ5u5`&g_MQaRd zaU7Ao8XQMuuN21-s0PPTs1%38x_Yl3Fs-|Y4!C-;M-8g@n*v@1|s#GQ665=9@Rxy?u0YW0&WN+~=RXpPbVXXL4m7Aq=E6I0%{06TwRn=U9d8>exk> zD-Z%M3DNQ`bTLSEF=%NFyoHcAkD*CiXqljo*0E?o$GiDC4q}}|%*0WghLlK#npw?hecrM}Mw?`E(z5C8< z8&*b^!{>5?4aT89vdrgBgSc-x6JZD3F^l#*G(@OO*^1D%Eu7?HAy<3kTLqW9N{^#6vso zVQwY48q7)m{~xQ64RV7{E7Y=&T~?^05Ky`5oNQ8bLgFCPq9co^R09BVRS1OAmH;hU zC#q(N!gNqm!zU#%sv{r5mm-Uv8b-~a1F-;p^>)pnXfKge4s9?;;MFIr*fixPG}NBA z6_G5BEmeO6XXh(emkciB{7tA;iwC2^s^VzyU_h0@ae84ACMY`cIDEju=<`q|2QAEv zW_)W|i|9aknqdmS=#w73eW_csQ$8IhT^vY1^1;X3&J0{%*tcQq!gJpr3w?TJc~@5= zKV5sM{$3k>b#S$@CTkhIF*{v*u(F&$&Yq1naHxt8Mz2N%7aQ3(^VNRZahk1||7?Bl z*idzO_u)FhRj4cPzDO>YA>>lxAGaciEiX8Xzp1SVPv91};$OG3cC&8!v3{Jq^kH@8 UTIccK;hzT5*3#}uZuEx!0OwrBv;Y7A literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/StoreLogo.png b/Source Code/Chapter 2/GrocerApp/GrocerApp/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb672712c6823a0c91548ded70a8acb85536b4d GIT binary patch literal 429 zcmV;e0aE^nP)NtYJa1l)bQ5qwGXpZbs7%2oRMd4y35$s&66(fxhNg8W02!vSn zdlrL2h^Fx+3=$z;kK{0D#MyeJ8WRWZcLSf(PcQ_mLOhrmC}O-tX^0c>5`YvCUZVsc zG-6#78ubjJ5nA;OX&^K(q=i6ZNE3m?kTwE^AqxZoLskfB3|S&1F=UO9!cY$g2@Lgu z;9{sJ1P9|X2L`r1#Gs8R{E^$PRrMaC86q| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mouse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Data/GroceryItem.cs b/Source Code/Chapter 2/GrocerApp/GrocerApp/Data/GroceryItem.cs new file mode 100644 index 0000000..1ab8849 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Data/GroceryItem.cs @@ -0,0 +1,31 @@ +using System.ComponentModel; + +namespace GrocerApp.Data { + + class GroceryItem : INotifyPropertyChanged { + private string name, store; + private int quantity; + + public string Name { + get { return name; } + set { name = value; NotifyPropertyChanged("Name"); } + } + + public int Quantity { + get { return quantity; } + set { quantity = value; NotifyPropertyChanged("Quantity"); } + } + + public string Store { + get { return store; } + set { store = value; NotifyPropertyChanged("Store"); } + } + + public event PropertyChangedEventHandler PropertyChanged; + private void NotifyPropertyChanged(string propName) { + if (PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs(propName)); + } + } + } +} diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Data/ViewModel.cs b/Source Code/Chapter 2/GrocerApp/GrocerApp/Data/ViewModel.cs new file mode 100644 index 0000000..0fa3520 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Data/ViewModel.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; + +namespace GrocerApp.Data { + + class ViewModel : INotifyPropertyChanged { + private ObservableCollection groceryList; + private List storeList; + private int selectedItemIndex; + private string homeZipCode; + + public ViewModel() { + groceryList = new ObservableCollection(); + storeList = new List(); + selectedItemIndex = -1; + homeZipCode = "NY 10118"; + } + + public string HomeZipCode { + get { return homeZipCode; } + set { homeZipCode = value; NotifyPropertyChanged("HomeZipCode"); } + } + + public int SelectedItemIndex { + get { return selectedItemIndex; } + set { + selectedItemIndex = value; NotifyPropertyChanged("SelectedItemIndex"); + } + } + + public ObservableCollection GroceryList { + get { + return groceryList; + } + } + + public List StoreList { + get { + return storeList; + } + } + + public event PropertyChangedEventHandler PropertyChanged; + private void NotifyPropertyChanged(string propName) { + if (PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs(propName)); + } + } + } + +} diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp.csproj b/Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp.csproj new file mode 100644 index 0000000..bcbc870 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp.csproj @@ -0,0 +1,172 @@ + + + + + Debug + AnyCPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2} + AppContainerExe + Properties + GrocerApp + GrocerApp + en-US + 512 + {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + GrocerApp_TemporaryKey.pfx + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE + prompt + 4 + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + ARM + false + prompt + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x64 + false + prompt + true + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x86 + false + prompt + true + + + + + + + App.xaml + + + + + ItemDetail.xaml + + + ListPage.xaml + + + NoItemSelected.xaml + + + + + + Designer + + + + + + + + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + PreserveNewest + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + 11.0 + + + + \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp.csproj.user b/Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp.csproj.user new file mode 100644 index 0000000..b29230c --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp.csproj.user @@ -0,0 +1,6 @@ + + + + True + + \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx b/Source Code/Chapter 2/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..27d6028a1b1fd721c26a8556804215fc7efbcf2e GIT binary patch literal 2504 zcmY+E2{hDe8^Hgw&txfEF_EQw#YnB+vKG_G8eHpvLq_Q<6OI;DJBx^>p zlx%ZJE(Te$R}w||rq1`>d+vG9^FGh>dzSY-?>X;-p`c!ZK@bcD6$eL2Ctpb3;Q%2( z#S~N!l!EeOVIqbC+x=GvwhE=dKCti{OQzv$|Epp@0su)8-br)F+!EM|SfhY@z(D}!VAO3)28?rQ*`x1J^Abcs zc1%2%c@ua-=7=gkVN|gy6ILx3xp8whRe`LBj9W^ikt5FdnkKec+ZkB|B*C=tjX8ga zL-%o<8u(*PjvK#U*QEGJWXD$3&pxpkQ-3pDvAV8=`7@eW=hCo6e#k|}7PJ$7)3SP- z`Mi=Kw=GZ*AX)z5ThMzAm@+W1&|B5+9Co*V^(7h`)v9aX zGj+w_tvmP0;s(Hd3G{xBm>cj`dVTxQf$h!bveIhfULVScA)f}w;l`)F_4g>nG_PIN zFNuprR`Y>_wQ*0Sc=Xbm3{CrMII7DTW8b{^VKWPk8tkOa-*_N4CyXSQ4bY7r`U*Rx z?T^;g(9aRhq9?_N^K|Gb+*S;G0aE%9T#xD+wIrF*tO6@OV>5>&pDc8msiA%^gN#7s z+4z`R32tHPDkdUj^MS3<7cC?a3qQW~WY8 z-iFx8EyL|JC;zY#exS6+E8B?3L5_O5d z-F~d&{!u#!ws?{TfWhh)sm0geVf$R8U))a>FiU>q8);20c#pLUzFM{)f4EUA;6H&# zZxd#oyQiRAs`w!n=eS4b)GSpS-&SU;1X5ssbqYS;O7QX!8+_H43a#_fYGa55szi?znHp`FbjW+o4urPCGp68to9*o+Sl}{Ze zvhleZvtYAlxVYu0bPgx``jGC#B~jL^DRga`TG`)My`Jrv*>S`W;e9M?Eo4g|wA(3` zT_Jc?xE%a&BGktRK;K9P@O-WukmyoH$iS_p_ON=Z{E% z)g8v_Go{Kc(yb)+RJ#{g|K9M3KpwH^Z$g`2a(kjnLmC-k*4`ie6ot$tRS1vG<4n{g z^K7H=j|Rxt_|2Oa3GMy0$4tY)ieAcEc$U0{QKg=!+Zo;wPABMrbpkc|$Q@`QcH#I#KofrRF^< z%KdfQWg7C%tOQ5SInYd1Vd)f~pPatD0FpSdTL(9C!-F_XJr_8tHOZs*rqZoQ3htEM@U z>L5*85*KI%lVuFVxD2NZJ!n|sC<@g18_h$_kT zoT7~kTJKMr=si0@L(8TDMfK0C;~vNN4_H_D`X{T~ZXSA%f`mRAG34gFokt?$CiD_q z@6#}97-0+o4wK=8fYDIit{4#U + + + + + + GrocerApp + adam + Assets\StoreLogo.png + + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ItemDetail.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ItemDetail.xaml new file mode 100644 index 0000000..d5be62b --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ItemDetail.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs new file mode 100644 index 0000000..00b0b90 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs @@ -0,0 +1,73 @@ +using GrocerApp.Data; +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace GrocerApp.Pages { + + public sealed partial class ItemDetail : Page { + private ViewModel viewModel; + + public ItemDetail() { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) { + + viewModel = e.Parameter as ViewModel; + this.DataContext = viewModel; + + viewModel.PropertyChanged += (sender, eventArgs) => { + if (eventArgs.PropertyName == "SelectedItemIndex") { + if (viewModel.SelectedItemIndex == -1) { + SetItemDetail(null); + } else { + SetItemDetail(viewModel.GroceryList + [viewModel.SelectedItemIndex]); + } + } + }; + SetItemDetail(viewModel.GroceryList[viewModel.SelectedItemIndex]); + } + + private void SetItemDetail(GroceryItem item) { + ItemDetailName.Text = (item == null) ? "" : item.Name; + ItemDetailQuantity.Text = (item == null) ? "" + : item.Quantity.ToString(); + + if (item != null) { + ItemDetailStore.SelectedItem = item.Store; + } else { + ItemDetailStore.SelectedIndex = -1; + } + } + + private void HandleItemChange(object sender, RoutedEventArgs e) { + if (viewModel.SelectedItemIndex > -1) { + + GroceryItem selectedItem = viewModel.GroceryList + [viewModel.SelectedItemIndex]; + + if (sender == ItemDetailName) { + selectedItem.Name = ItemDetailName.Text; + + } else if (sender == ItemDetailQuantity) { + int intVal; + bool parsed = Int32.TryParse(ItemDetailQuantity.Text, + out intVal); + if (parsed) { + selectedItem.Quantity = intVal; + } + } else if (sender == ItemDetailStore) { + string store = (String)((ComboBox)sender).SelectedItem; + + if (store != null) { + viewModel.GroceryList + [viewModel.SelectedItemIndex].Store = store; + } + } + } + } + } +} diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ListPage.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ListPage.xaml new file mode 100644 index 0000000..0b07b10 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ListPage.xaml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ListPage.xaml.cs b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ListPage.xaml.cs new file mode 100644 index 0000000..a2a6e08 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/ListPage.xaml.cs @@ -0,0 +1,62 @@ +using GrocerApp.Data; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace GrocerApp.Pages { + + public sealed partial class ListPage : Page { + ViewModel viewModel; + + + public ListPage() { + + viewModel = new ViewModel(); + + viewModel.StoreList.Add("Whole Foods"); + viewModel.StoreList.Add("Kroger"); + viewModel.StoreList.Add("Costco"); + viewModel.StoreList.Add("Walmart"); + + viewModel.GroceryList.Add(new GroceryItem { + Name = "Apples", + Quantity = 4, Store = "Whole Foods" + }); + viewModel.GroceryList.Add(new GroceryItem { + Name = "Hotdogs", + Quantity = 12, Store = "Costco" + }); + viewModel.GroceryList.Add(new GroceryItem { + Name = "Soda", + Quantity = 2, Store = "Costco" + }); + viewModel.GroceryList.Add(new GroceryItem { + Name = "Eggs", + Quantity = 12, Store = "Kroger" + }); + + + this.InitializeComponent(); + + this.DataContext = viewModel; + + ItemDetailFrame.Navigate(typeof(NoItemSelected)); + + viewModel.PropertyChanged += (sender, args) => { + if (args.PropertyName == "SelectedItemIndex") { + if (viewModel.SelectedItemIndex == -1) { + ItemDetailFrame.Navigate(typeof(NoItemSelected)); + } else { + ItemDetailFrame.Navigate(typeof(ItemDetail), viewModel); + } + } + }; + } + + protected override void OnNavigatedTo(NavigationEventArgs e) { + } + + private void ListSelectionChanged(object sender, SelectionChangedEventArgs e) { + viewModel.SelectedItemIndex = groceryList.SelectedIndex; + } + } +} diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml new file mode 100644 index 0000000..484abad --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml.cs b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml.cs new file mode 100644 index 0000000..65510c8 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Pages/NoItemSelected.xaml.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; + +// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 + +namespace GrocerApp.Pages { + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class NoItemSelected : Page { + public NoItemSelected() { + this.InitializeComponent(); + } + + /// + /// Invoked when this page is about to be displayed in a Frame. + /// + /// Event data that describes how this page was reached. The Parameter + /// property is typically used to configure the page. + protected override void OnNavigatedTo(NavigationEventArgs e) { + } + } +} diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs b/Source Code/Chapter 2/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f2e348e --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GrocerApp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GrocerApp")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/Resources/GrocerResourceDictionary.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/Resources/GrocerResourceDictionary.xaml new file mode 100644 index 0000000..19a1c3f --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/Resources/GrocerResourceDictionary.xaml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/App.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/App.xaml new file mode 100644 index 0000000..ffa7458 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/App.xaml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/App.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/App.xaml new file mode 100644 index 0000000..ffa7458 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/App.xaml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/AppxManifest.xml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/AppxManifest.xml new file mode 100644 index 0000000..1729ee4 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/AppxManifest.xml @@ -0,0 +1,42 @@ + + + + + + GrocerApp + adam + Assets\StoreLogo.png + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/Logo.png b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e26771cb33a49bbef824aa333737181b0a5b09a3 GIT binary patch literal 801 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=1foIEGZ*dUJQLud<^=L*gE#63Ho!PGzwUb%GPK6&5iF zt!p@aGNX}6(PVh|N)M-?0RNcTbjaWgEU8noxUax-n>&3Ay)#!y&O11y2sKEF zt72@XC1)RvT6Xw=y_`Ce)`nGULLL^lI$kwi^E+dQT7YeXY4GvlRR%kj1x$VZi%Bdd zz}2Giy=-_$h+v#(S+};)DuE4EM?_^qB_eDeo@&q%StD1F>L|*0ZC2sb-}llSMTM?O z6{b3iid~yk@VE7q7Wb+P8?H5IYp?pSVcLE~18m#ygK20HL@6W5woI~Fjlw$fX1U{xQA5a+t0 zH$WNIb=fNpWHo}M9#;K6eszDZKty_|-?j4iocj5#zotrWc;@;w`H@=mjsvS2wXX0_ zY}l$4@^sE?UcC)ji*L=Z&}P!xaL&2((OQlj2dv~pV-ifAS;ZsH1{`D!GY%yys5WH)f>ZLo5m%6XjuXdbKMR7MEHSyb{m!_{Afji&MT$_sz7 z>1{~MlIFe28FRN(GC_~;#Jp4ADipP+9hh|P#-&`vO-Upt3jE0@YLh(^55uYWl9g)Z RA3>Rb!PC{xWt~$(69A&hN*MqE literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/SmallLogo.png b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb0d9d528c42f132872e8af4dc563081b0b9aff GIT binary patch literal 329 zcmV-P0k-~$P)q$gGRCwC#*X;?zAP@%N+|i#I!$mrh zlQ>KU$Rdu>|JH&931_?y6Djl{gb>4nCV5pzDJ?S!mq|4ZejKj%i@j$H{#ML~2Y{DF z$=}bKPaz+UGt{v(4CTQQXym}&iW8{s!ew~XIE7NLjQpy#I2S$rous$~?f%DHT#B*+ zq=#!zc5=0FEqWFpB%UE(L807on!pidHPLgYO}XEgorrg;PB=8ipgQ5u5`&g_MQaRd zaU7Ao8XQMuuN21-s0PPTs1%38x_Yl3Fs-|Y4!C-;M-8g@n*v@1|s#GQ665=9@Rxy?u0YW0&WN+~=RXpPbVXXL4m7Aq=E6I0%{06TwRn=U9d8>exk> zD-Z%M3DNQ`bTLSEF=%NFyoHcAkD*CiXqljo*0E?o$GiDC4q}}|%*0WghLlK#npw?hecrM}Mw?`E(z5C8< z8&*b^!{>5?4aT89vdrgBgSc-x6JZD3F^l#*G(@OO*^1D%Eu7?HAy<3kTLqW9N{^#6vso zVQwY48q7)m{~xQ64RV7{E7Y=&T~?^05Ky`5oNQ8bLgFCPq9co^R09BVRS1OAmH;hU zC#q(N!gNqm!zU#%sv{r5mm-Uv8b-~a1F-;p^>)pnXfKge4s9?;;MFIr*fixPG}NBA z6_G5BEmeO6XXh(emkciB{7tA;iwC2^s^VzyU_h0@ae84ACMY`cIDEju=<`q|2QAEv zW_)W|i|9aknqdmS=#w73eW_csQ$8IhT^vY1^1;X3&J0{%*tcQq!gJpr3w?TJc~@5= zKV5sM{$3k>b#S$@CTkhIF*{v*u(F&$&Yq1naHxt8Mz2N%7aQ3(^VNRZahk1||7?Bl z*idzO_u)FhRj4cPzDO>YA>>lxAGaciEiX8Xzp1SVPv91};$OG3cC&8!v3{Jq^kH@8 UTIccK;hzT5*3#}uZuEx!0OwrBv;Y7A literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/StoreLogo.png b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb672712c6823a0c91548ded70a8acb85536b4d GIT binary patch literal 429 zcmV;e0aE^nP)NtYJa1l)bQ5qwGXpZbs7%2oRMd4y35$s&66(fxhNg8W02!vSn zdlrL2h^Fx+3=$z;kK{0D#MyeJ8WRWZcLSf(PcQ_mLOhrmC}O-tX^0c>5`YvCUZVsc zG-6#78ubjJ5nA;OX&^K(q=i6ZNE3m?kTwE^AqxZoLskfB3|S&1F=UO9!cY$g2@Lgu z;9{sJ1P9|X2L`r1#Gs8R{E^$PRrMaC86q| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mouse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/GrocerApp.exe b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/GrocerApp.exe new file mode 100644 index 0000000000000000000000000000000000000000..73201fdf3065e656d6f31bee8481d2cd959ba25b GIT binary patch literal 24064 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 F{C}g6!z2Iz literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/ItemDetail.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/ItemDetail.xaml new file mode 100644 index 0000000..54e4e89 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/ItemDetail.xaml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/ListPage.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/ListPage.xaml new file mode 100644 index 0000000..1f07360 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/ListPage.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/NoItemSelected.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/NoItemSelected.xaml new file mode 100644 index 0000000..d96fc1e --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Pages/NoItemSelected.xaml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Resources/GrocerResourceDictionary.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Resources/GrocerResourceDictionary.xaml new file mode 100644 index 0000000..19329e7 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/Resources/GrocerResourceDictionary.xaml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/resources.pri b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/resources.pri new file mode 100644 index 0000000000000000000000000000000000000000..cb91b3e9d96787babe433243a065097493d4794f GIT binary patch literal 2568 zcmeH}%}!H66vzK9ZJ`QUHO8n>S!kjLq$&csBM^{;5JDFig*3Ijd?fu!F9zJX&_p*b zd;%VTjZfeM=)$Ed)-2qb7-E9IGq)G6Hh?j#jB_(HXU^B0nK|>HTWM7C^~Q2mimBt6 z)GcY9n$XS;ot{)sD0#(de!03(n>W^Oc?9L;I4F63(OcV-o9tmIU-FAfUZpVK-3=!w z>vUUfP5XxD=PQMJKEG%GIw5_g?l-^rw-R$-+_fPm=%a0Hcd)trZS$bGE#{!u`UCHT z=}Me7q|MJk>$A04i7BgVu6IMd+IssV1<6*cB452KsLr>h2kPT1pg*KR-BpQp2zgeX zZZqyxKhz!FgSyXn0o`6kL+}RR6!jFj=?o(4!~aqFvdDX>8EP2&SLpAyAwe+_C8;qb zGr_K%(6Bo623|~^(5cMjCOraujtq4ufkh(EL6!07YYDpOv^-={jSBKIU#oR12bV`y?4BQlQ-)Didg3vcKccn#xBG4N zQxket*~@D4j?X%}#2&1&=00xs|MIWzfMrMO@y8n-AV!?eo(D^f@J+EaN>UA9nx1M-Rg`!)$x8qv-Z4 rjt9Q>L%UYp!_Y7KMwsvYvG8}_t=MRIW|+0Py|Zcmd-i*0|9?LL0e~qR literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/vs.appxrecipe b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/vs.appxrecipe new file mode 100644 index 0000000..9e7b949 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppX/vs.appxrecipe @@ -0,0 +1,82 @@ + + + + TINY + adam + Debug|AnyCPU + neutral + 54C69677BE5E223FF97137A042AC6839BFACD8A3E23204BDE309CE1FA84DDC06 + a0873d78-0e13-4e25-93fa-58269cbe4e7f_1.0.0.0_neutral__6fxp0bkxjs8ye + a0873d78-0e13-4e25-93fa-58269cbe4e7f_6fxp0bkxjs8ye!App + a0873d78-0e13-4e25-93fa-58269cbe4e7f + CN=adam + 1.0.0.0 + + + + AppxManifest.xml + true + 2012-09-25T08:26:40.210 + + + + + GrocerApp.exe + 2012-09-25T08:26:40.127 + + + GrocerApp.pdb + 2012-09-25T08:26:40.114 + + + Assets\Logo.png + true + 2012-03-15T19:42:52.000 + + + Assets\SmallLogo.png + true + 2012-03-15T19:42:52.000 + + + Assets\SplashScreen.png + true + 2012-03-15T19:42:52.000 + + + Assets\StoreLogo.png + true + 2012-03-15T19:42:52.000 + + + App.xaml + 2012-09-25T08:01:52.971 + + + Pages\ItemDetail.xaml + 2012-09-25T08:22:30.499 + + + Pages\NoItemSelected.xaml + 2012-09-25T08:14:13.969 + + + Resources\GrocerResourceDictionary.xaml + 2012-09-25T08:21:37.869 + + + Pages\ListPage.xaml + 2012-09-25T08:12:34.103 + + + Common\StandardStyles.xaml + 2012-06-26T15:19:20.000 + + + resources.pri + 2012-09-25T08:26:40.169 + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppxManifest.xml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppxManifest.xml new file mode 100644 index 0000000..1729ee4 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/AppxManifest.xml @@ -0,0 +1,42 @@ + + + + + + GrocerApp + adam + Assets\StoreLogo.png + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Common/StandardStyles.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Common/StandardStyles.xaml new file mode 100644 index 0000000..ceec3df --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Common/StandardStyles.xaml @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mouse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/GrocerApp.build.appxrecipe b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/GrocerApp.build.appxrecipe new file mode 100644 index 0000000..3f60562 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/GrocerApp.build.appxrecipe @@ -0,0 +1,62 @@ + + + + TINY + adam + Debug|AnyCPU + neutral + + + + AppxManifest.xml + true + + + + + GrocerApp.exe + + + GrocerApp.pdb + + + Assets\Logo.png + true + + + Assets\SmallLogo.png + true + + + Assets\SplashScreen.png + true + + + Assets\StoreLogo.png + true + + + App.xaml + + + Pages\ItemDetail.xaml + + + Pages\NoItemSelected.xaml + + + Resources\GrocerResourceDictionary.xaml + + + Pages\ListPage.xaml + + + Common\StandardStyles.xaml + + + resources.pri + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/GrocerApp.exe b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/GrocerApp.exe new file mode 100644 index 0000000000000000000000000000000000000000..73201fdf3065e656d6f31bee8481d2cd959ba25b GIT binary patch literal 24064 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 F{C}g6!z2Iz literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/MainPage.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/MainPage.xaml new file mode 100644 index 0000000..4fe838c --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/MainPage.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/ItemDetail.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/ItemDetail.xaml new file mode 100644 index 0000000..54e4e89 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/ItemDetail.xaml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/ListPage.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/ListPage.xaml new file mode 100644 index 0000000..1f07360 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/ListPage.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/NoItemSelected.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/NoItemSelected.xaml new file mode 100644 index 0000000..d96fc1e --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Pages/NoItemSelected.xaml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Resources/GrocerResourceDictionary.xaml b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Resources/GrocerResourceDictionary.xaml new file mode 100644 index 0000000..19329e7 --- /dev/null +++ b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/Resources/GrocerResourceDictionary.xaml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/resources.pri b/Source Code/Chapter 2/GrocerApp/GrocerApp/bin/Debug/resources.pri new file mode 100644 index 0000000000000000000000000000000000000000..cb91b3e9d96787babe433243a065097493d4794f GIT binary patch literal 2568 zcmeH}%}!H66vzK9ZJ`QUHO8n>S!kjLq$&csBM^{;5JDFig*3Ijd?fu!F9zJX&_p*b zd;%VTjZfeM=)$Ed)-2qb7-E9IGq)G6Hh?j#jB_(HXU^B0nK|>HTWM7C^~Q2mimBt6 z)GcY9n$XS;ot{)sD0#(de!03(n>W^Oc?9L;I4F63(OcV-o9tmIU-FAfUZpVK-3=!w z>vUUfP5XxD=PQMJKEG%GIw5_g?l-^rw-R$-+_fPm=%a0Hcd)trZS$bGE#{!u`UCHT z=}Me7q|MJk>$A04i7BgVu6IMd+IssV1<6*cB452KsLr>h2kPT1pg*KR-BpQp2zgeX zZZqyxKhz!FgSyXn0o`6kL+}RR6!jFj=?o(4!~aqFvdDX>8EP2&SLpAyAwe+_C8;qb zGr_K%(6Bo623|~^(5cMjCOraujtq4ufkh(EL6!07YYDpOv^-={jSBKIU#oR12bV`y?4BQlQ-)Didg3vcKccn#xBG4N zQxket*~@D4j?X%}#2&1&=00xs|MIWzfMrMO@y8n-AV!?eo(D^f@J+EaN>UA9nx1M-Rg`!)$x8qv-Z4 rjt9Q>L%UYp!_Y7KMwsvYvG8}_t=MRIW|+0Py|Zcmd-i*0|9?LL0e~qR literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp.sln b/Source Code/Chapter 3/GrocerApp/GrocerApp.sln new file mode 100644 index 0000000..9185511 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows 8 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GrocerApp", "GrocerApp\GrocerApp.csproj", "{2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|ARM.ActiveCfg = Debug|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|ARM.Build.0 = Debug|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|ARM.Deploy.0 = Debug|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x64.ActiveCfg = Debug|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x64.Build.0 = Debug|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x64.Deploy.0 = Debug|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x86.ActiveCfg = Debug|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x86.Build.0 = Debug|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Debug|x86.Deploy.0 = Debug|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|Any CPU.Build.0 = Release|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|Any CPU.Deploy.0 = Release|Any CPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|ARM.ActiveCfg = Release|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|ARM.Build.0 = Release|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|ARM.Deploy.0 = Release|ARM + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x64.ActiveCfg = Release|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x64.Build.0 = Release|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x64.Deploy.0 = Release|x64 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x86.ActiveCfg = Release|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x86.Build.0 = Release|x86 + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2}.Release|x86.Deploy.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp.v11.suo b/Source Code/Chapter 3/GrocerApp/GrocerApp.v11.suo new file mode 100644 index 0000000000000000000000000000000000000000..0e6c536a8799ebff7dc3be593a4f4069c3365573 GIT binary patch literal 159744 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 Skcxf4Dz6Q=zPc@24g7!H6y|^c literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/App.xaml b/Source Code/Chapter 3/GrocerApp/GrocerApp/App.xaml new file mode 100644 index 0000000..fc45fa5 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/App.xaml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/App.xaml.cs b/Source Code/Chapter 3/GrocerApp/GrocerApp/App.xaml.cs new file mode 100644 index 0000000..362baf2 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/App.xaml.cs @@ -0,0 +1,48 @@ +using System; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace GrocerApp { + + sealed partial class App : Application { + + public App() { + this.InitializeComponent(); + this.Suspending += OnSuspending; + } + + protected override void OnLaunched(LaunchActivatedEventArgs args) { + Frame rootFrame = Window.Current.Content as Frame; + + + if (rootFrame == null) { + // Create a Frame to act as the navigation context and navigate to the first page + rootFrame = new Frame(); + + if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { + //TODO: Load state from previously suspended application + } + + // Place the frame in the current Window + Window.Current.Content = rootFrame; + } + +if (rootFrame.Content == null) { + + if (!rootFrame.Navigate(typeof(Pages.MainPage), args.Arguments)) { + throw new Exception("Failed to create initial page"); + } +} + // Ensure the current window is active + Window.Current.Activate(); + } + + private void OnSuspending(object sender, SuspendingEventArgs e) { + var deferral = e.SuspendingOperation.GetDeferral(); + //TODO: Save application state and stop any background activity + deferral.Complete(); + } + } +} diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/Logo.png b/Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e26771cb33a49bbef824aa333737181b0a5b09a3 GIT binary patch literal 801 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=1foIEGZ*dUJQLud<^=L*gE#63Ho!PGzwUb%GPK6&5iF zt!p@aGNX}6(PVh|N)M-?0RNcTbjaWgEU8noxUax-n>&3Ay)#!y&O11y2sKEF zt72@XC1)RvT6Xw=y_`Ce)`nGULLL^lI$kwi^E+dQT7YeXY4GvlRR%kj1x$VZi%Bdd zz}2Giy=-_$h+v#(S+};)DuE4EM?_^qB_eDeo@&q%StD1F>L|*0ZC2sb-}llSMTM?O z6{b3iid~yk@VE7q7Wb+P8?H5IYp?pSVcLE~18m#ygK20HL@6W5woI~Fjlw$fX1U{xQA5a+t0 zH$WNIb=fNpWHo}M9#;K6eszDZKty_|-?j4iocj5#zotrWc;@;w`H@=mjsvS2wXX0_ zY}l$4@^sE?UcC)ji*L=Z&}P!xaL&2((OQlj2dv~pV-ifAS;ZsH1{`D!GY%yys5WH)f>ZLo5m%6XjuXdbKMR7MEHSyb{m!_{Afji&MT$_sz7 z>1{~MlIFe28FRN(GC_~;#Jp4ADipP+9hh|P#-&`vO-Upt3jE0@YLh(^55uYWl9g)Z RA3>Rb!PC{xWt~$(69A&hN*MqE literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/SmallLogo.png b/Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb0d9d528c42f132872e8af4dc563081b0b9aff GIT binary patch literal 329 zcmV-P0k-~$P)q$gGRCwC#*X;?zAP@%N+|i#I!$mrh zlQ>KU$Rdu>|JH&931_?y6Djl{gb>4nCV5pzDJ?S!mq|4ZejKj%i@j$H{#ML~2Y{DF z$=}bKPaz+UGt{v(4CTQQXym}&iW8{s!ew~XIE7NLjQpy#I2S$rous$~?f%DHT#B*+ zq=#!zc5=0FEqWFpB%UE(L807on!pidHPLgYO}XEgorrg;PB=8ipgQ5u5`&g_MQaRd zaU7Ao8XQMuuN21-s0PPTs1%38x_Yl3Fs-|Y4!C-;M-8g@n*v@1|s#GQ665=9@Rxy?u0YW0&WN+~=RXpPbVXXL4m7Aq=E6I0%{06TwRn=U9d8>exk> zD-Z%M3DNQ`bTLSEF=%NFyoHcAkD*CiXqljo*0E?o$GiDC4q}}|%*0WghLlK#npw?hecrM}Mw?`E(z5C8< z8&*b^!{>5?4aT89vdrgBgSc-x6JZD3F^l#*G(@OO*^1D%Eu7?HAy<3kTLqW9N{^#6vso zVQwY48q7)m{~xQ64RV7{E7Y=&T~?^05Ky`5oNQ8bLgFCPq9co^R09BVRS1OAmH;hU zC#q(N!gNqm!zU#%sv{r5mm-Uv8b-~a1F-;p^>)pnXfKge4s9?;;MFIr*fixPG}NBA z6_G5BEmeO6XXh(emkciB{7tA;iwC2^s^VzyU_h0@ae84ACMY`cIDEju=<`q|2QAEv zW_)W|i|9aknqdmS=#w73eW_csQ$8IhT^vY1^1;X3&J0{%*tcQq!gJpr3w?TJc~@5= zKV5sM{$3k>b#S$@CTkhIF*{v*u(F&$&Yq1naHxt8Mz2N%7aQ3(^VNRZahk1||7?Bl z*idzO_u)FhRj4cPzDO>YA>>lxAGaciEiX8Xzp1SVPv91};$OG3cC&8!v3{Jq^kH@8 UTIccK;hzT5*3#}uZuEx!0OwrBv;Y7A literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/StoreLogo.png b/Source Code/Chapter 3/GrocerApp/GrocerApp/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb672712c6823a0c91548ded70a8acb85536b4d GIT binary patch literal 429 zcmV;e0aE^nP)NtYJa1l)bQ5qwGXpZbs7%2oRMd4y35$s&66(fxhNg8W02!vSn zdlrL2h^Fx+3=$z;kK{0D#MyeJ8WRWZcLSf(PcQ_mLOhrmC}O-tX^0c>5`YvCUZVsc zG-6#78ubjJ5nA;OX&^K(q=i6ZNE3m?kTwE^AqxZoLskfB3|S&1F=UO9!cY$g2@Lgu z;9{sJ1P9|X2L`r1#Gs8R{E^$PRrMaC86q|OcbkQYXsN;Sr0E8 zaOgCcA~3;p_E|<|kUX?tF=8-fFk^^kFkwh#Fa}~vAU}m6iNOL$8UyK61|uMyjKf3* z1}z3AMv(oWvIs=uREQ?w3QFui0JGl|XsKPYP0ftUk`If0l9h`E872Z(ur zm=B2gff!f?FbD!MsO%61(jq`C3dCYSEDppV@li0iLqGx;PoTKhh31DV%$NWD+v$9+ zGr-TCmrDv1^}L=QE4e<(uQ=9pZBTHGn4qBJAt0v0!7bFn z%6X`XCDE~os=^h&o^R_fJ@al`-|S#>#2W7Bmf0wupEO6C{3_Md9uI9<`H?Hr=!6Os11 zFtzhk3)kr!({-P2wSN!j`w%#@AaUl}qf>RYgpG7IPu<}bICo##jTJsOHk{e|_>|OC zPT6TY!(wJGHhOs2XnLP^b%>g4#IqofTV|?iO;*!c+_zfzs&nOA`L8yuA&HWqF~)&A z|IA*s-9vm@q_y6nD!tT*w6!}rUhUbEICJ|k*O1FW?Wu9n;(=e6@}J&gqPJ+4d&JdC zJ36u?4@u4J?p`rXd5!Si9j897m2uh1kT~~Z=j+D>RW2dI9NC9lVv=31I!4HvuDgHu zs`36;9mX817w25d^)KD^$FzH&%h|3CYFAd+@rI|%&KGO6c_1ZMh^oXf$X+(bK zD#dl5FSTuT14`IVH(F!5IIH9J%96yXp8tZ{LP4DUA&FB@Ze3uXo$ zt!Sp>VZA`DDv7a1tJJDv9viDmy zYcddMO?|)*zun7JaeZdYN{6(>_$K zl+UzVRXxk~horl_Q$;Ob?a}P`$0kP#XV=X*n6t9+QNOd*#j9LLO~nm&^e2n^1;i9z zWb-@y`k3S?Imx?M<6^p%K9+8JBqq{naOqK)h-hNSVOxz=hdd7L)d)J+@i22n;F31M zgRvS$2lt<0nVkMB_S?_4%S+mBx_KRLU7e8meG~8UqpLTx9IHIlE&fny*5?OGYg~)N z<{Sz$Nk3@5LHulH;kUC>{S6j>KEa!yS6BSjO>pOD*ZR+u)lo;k|2QFaF!np!?dVtL NE0bP=LJ5B?0RTDX@P_~Z literal 0 HcmV?d00001 diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Common/StandardStyles.xaml b/Source Code/Chapter 3/GrocerApp/GrocerApp/Common/StandardStyles.xaml new file mode 100644 index 0000000..1afaf54 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Common/StandardStyles.xaml @@ -0,0 +1,1837 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mouse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Data/GroceryItem.cs b/Source Code/Chapter 3/GrocerApp/GrocerApp/Data/GroceryItem.cs new file mode 100644 index 0000000..1ab8849 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Data/GroceryItem.cs @@ -0,0 +1,31 @@ +using System.ComponentModel; + +namespace GrocerApp.Data { + + class GroceryItem : INotifyPropertyChanged { + private string name, store; + private int quantity; + + public string Name { + get { return name; } + set { name = value; NotifyPropertyChanged("Name"); } + } + + public int Quantity { + get { return quantity; } + set { quantity = value; NotifyPropertyChanged("Quantity"); } + } + + public string Store { + get { return store; } + set { store = value; NotifyPropertyChanged("Store"); } + } + + public event PropertyChangedEventHandler PropertyChanged; + private void NotifyPropertyChanged(string propName) { + if (PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs(propName)); + } + } + } +} diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Data/ViewModel.cs b/Source Code/Chapter 3/GrocerApp/GrocerApp/Data/ViewModel.cs new file mode 100644 index 0000000..0fa3520 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Data/ViewModel.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; + +namespace GrocerApp.Data { + + class ViewModel : INotifyPropertyChanged { + private ObservableCollection groceryList; + private List storeList; + private int selectedItemIndex; + private string homeZipCode; + + public ViewModel() { + groceryList = new ObservableCollection(); + storeList = new List(); + selectedItemIndex = -1; + homeZipCode = "NY 10118"; + } + + public string HomeZipCode { + get { return homeZipCode; } + set { homeZipCode = value; NotifyPropertyChanged("HomeZipCode"); } + } + + public int SelectedItemIndex { + get { return selectedItemIndex; } + set { + selectedItemIndex = value; NotifyPropertyChanged("SelectedItemIndex"); + } + } + + public ObservableCollection GroceryList { + get { + return groceryList; + } + } + + public List StoreList { + get { + return storeList; + } + } + + public event PropertyChangedEventHandler PropertyChanged; + private void NotifyPropertyChanged(string propName) { + if (PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs(propName)); + } + } + } + +} diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml new file mode 100644 index 0000000..b4d917e --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs new file mode 100644 index 0000000..ed84b26 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs @@ -0,0 +1,29 @@ +using System; +using GrocerApp.Data; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace GrocerApp.Flyouts { + public sealed partial class AddItemFlyout : UserControl { + + public AddItemFlyout() { + this.InitializeComponent(); + } + + public void Show(Page page, AppBar appbar, Button button) { + AddItemPopup.IsOpen = true; + FlyoutHelper.ShowRelativeToAppBar(AddItemPopup, page, appbar, button); + } + + private void AddButtonClick(object sender, RoutedEventArgs e) { + + ((ViewModel)DataContext).GroceryList.Add(new GroceryItem { + Name = ItemName.Text, + Quantity = Int32.Parse(ItemQuantity.Text), + Store = ItemStore.SelectedItem.ToString() + }); + + AddItemPopup.IsOpen = false; + } + } +} diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs new file mode 100644 index 0000000..23de22a --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs @@ -0,0 +1,38 @@ +using System; +using Windows.Foundation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; + +namespace GrocerApp.Flyouts { + class FlyoutHelper { + + public static void ShowRelativeToAppBar(Popup popup, Page page, + AppBar appbar, Button button) { + + Func getOffset = + delegate(UIElement control1, UIElement control2) { + return control1.TransformToVisual(control2) + .TransformPoint(new Point(0, 0)); + }; + + Point popupOffset = getOffset(popup, page); + + Point buttonOffset = getOffset(button, page); + popup.HorizontalOffset = buttonOffset.X - popupOffset.X + - (popup.ActualWidth / 2) + (button.ActualWidth / 2); + popup.VerticalOffset = getOffset(appbar, page).Y + - popupOffset.Y - popup.ActualHeight; + + if (popupOffset.X + popup.HorizontalOffset + + popup.ActualWidth > page.ActualWidth) { + + popup.HorizontalOffset = page.ActualWidth + - popupOffset.X - popup.ActualWidth; + } else if (popup.HorizontalOffset + popupOffset.X < 0) { + popup.HorizontalOffset = -popupOffset.X; + } + } + + } +} diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml new file mode 100644 index 0000000..7edbf11 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs new file mode 100644 index 0000000..081555e --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs @@ -0,0 +1,20 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace GrocerApp.Flyouts { + public sealed partial class HomeZipCodeFlyout : UserControl { + + public HomeZipCodeFlyout() { + this.InitializeComponent(); + } + + public void Show(Page page, AppBar appbar, Button button) { + HomeZipCodePopup.IsOpen = true; + FlyoutHelper.ShowRelativeToAppBar(HomeZipCodePopup, page, appbar, button); + } + + private void OKButtonClick(object sender, RoutedEventArgs e) { + HomeZipCodePopup.IsOpen = false; + } + } +} diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp.csproj b/Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp.csproj new file mode 100644 index 0000000..cb089b7 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp.csproj @@ -0,0 +1,201 @@ + + + + + Debug + AnyCPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2} + AppContainerExe + Properties + GrocerApp + GrocerApp + en-US + 512 + {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + GrocerApp_TemporaryKey.pfx + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE + prompt + 4 + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + ARM + false + prompt + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x64 + false + prompt + true + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x86 + false + prompt + true + + + + + + + App.xaml + + + + + AddItemFlyout.xaml + + + + HomeZipCodeFlyout.xaml + + + DetailPage.xaml + + + ItemDetail.xaml + + + ListPage.xaml + + + MainPage.xaml + + + NoItemSelected.xaml + + + + + + Designer + + + + + + + + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + PreserveNewest + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + 11.0 + + + + \ No newline at end of file diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp.csproj.user b/Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp.csproj.user new file mode 100644 index 0000000..b29230c --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp.csproj.user @@ -0,0 +1,6 @@ + + + + True + + \ No newline at end of file diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx b/Source Code/Chapter 3/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..27d6028a1b1fd721c26a8556804215fc7efbcf2e GIT binary patch literal 2504 zcmY+E2{hDe8^Hgw&txfEF_EQw#YnB+vKG_G8eHpvLq_Q<6OI;DJBx^>p zlx%ZJE(Te$R}w||rq1`>d+vG9^FGh>dzSY-?>X;-p`c!ZK@bcD6$eL2Ctpb3;Q%2( z#S~N!l!EeOVIqbC+x=GvwhE=dKCti{OQzv$|Epp@0su)8-br)F+!EM|SfhY@z(D}!VAO3)28?rQ*`x1J^Abcs zc1%2%c@ua-=7=gkVN|gy6ILx3xp8whRe`LBj9W^ikt5FdnkKec+ZkB|B*C=tjX8ga zL-%o<8u(*PjvK#U*QEGJWXD$3&pxpkQ-3pDvAV8=`7@eW=hCo6e#k|}7PJ$7)3SP- z`Mi=Kw=GZ*AX)z5ThMzAm@+W1&|B5+9Co*V^(7h`)v9aX zGj+w_tvmP0;s(Hd3G{xBm>cj`dVTxQf$h!bveIhfULVScA)f}w;l`)F_4g>nG_PIN zFNuprR`Y>_wQ*0Sc=Xbm3{CrMII7DTW8b{^VKWPk8tkOa-*_N4CyXSQ4bY7r`U*Rx z?T^;g(9aRhq9?_N^K|Gb+*S;G0aE%9T#xD+wIrF*tO6@OV>5>&pDc8msiA%^gN#7s z+4z`R32tHPDkdUj^MS3<7cC?a3qQW~WY8 z-iFx8EyL|JC;zY#exS6+E8B?3L5_O5d z-F~d&{!u#!ws?{TfWhh)sm0geVf$R8U))a>FiU>q8);20c#pLUzFM{)f4EUA;6H&# zZxd#oyQiRAs`w!n=eS4b)GSpS-&SU;1X5ssbqYS;O7QX!8+_H43a#_fYGa55szi?znHp`FbjW+o4urPCGp68to9*o+Sl}{Ze zvhleZvtYAlxVYu0bPgx``jGC#B~jL^DRga`TG`)My`Jrv*>S`W;e9M?Eo4g|wA(3` zT_Jc?xE%a&BGktRK;K9P@O-WukmyoH$iS_p_ON=Z{E% z)g8v_Go{Kc(yb)+RJ#{g|K9M3KpwH^Z$g`2a(kjnLmC-k*4`ie6ot$tRS1vG<4n{g z^K7H=j|Rxt_|2Oa3GMy0$4tY)ieAcEc$U0{QKg=!+Zo;wPABMrbpkc|$Q@`QcH#I#KofrRF^< z%KdfQWg7C%tOQ5SInYd1Vd)f~pPatD0FpSdTL(9C!-F_XJr_8tHOZs*rqZoQ3htEM@U z>L5*85*KI%lVuFVxD2NZJ!n|sC<@g18_h$_kT zoT7~kTJKMr=si0@L(8TDMfK0C;~vNN4_H_D`X{T~ZXSA%f`mRAG34gFokt?$CiD_q z@6#}97-0+o4wK=8fYDIit{4#U + + + + + + GrocerApp + adam + Assets\StoreLogo.png + + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/DetailPage.xaml b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/DetailPage.xaml new file mode 100644 index 0000000..0d198dc --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/DetailPage.xaml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs new file mode 100644 index 0000000..34d714a --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; + +// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 + +namespace GrocerApp.Pages { + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class DetailPage : Page { + public DetailPage() { + this.InitializeComponent(); + } + + /// + /// Invoked when this page is about to be displayed in a Frame. + /// + /// Event data that describes how this page was reached. The Parameter + /// property is typically used to configure the page. + protected override void OnNavigatedTo(NavigationEventArgs e) { + } + } +} diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ItemDetail.xaml b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ItemDetail.xaml new file mode 100644 index 0000000..d5be62b --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ItemDetail.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs new file mode 100644 index 0000000..00b0b90 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs @@ -0,0 +1,73 @@ +using GrocerApp.Data; +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace GrocerApp.Pages { + + public sealed partial class ItemDetail : Page { + private ViewModel viewModel; + + public ItemDetail() { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) { + + viewModel = e.Parameter as ViewModel; + this.DataContext = viewModel; + + viewModel.PropertyChanged += (sender, eventArgs) => { + if (eventArgs.PropertyName == "SelectedItemIndex") { + if (viewModel.SelectedItemIndex == -1) { + SetItemDetail(null); + } else { + SetItemDetail(viewModel.GroceryList + [viewModel.SelectedItemIndex]); + } + } + }; + SetItemDetail(viewModel.GroceryList[viewModel.SelectedItemIndex]); + } + + private void SetItemDetail(GroceryItem item) { + ItemDetailName.Text = (item == null) ? "" : item.Name; + ItemDetailQuantity.Text = (item == null) ? "" + : item.Quantity.ToString(); + + if (item != null) { + ItemDetailStore.SelectedItem = item.Store; + } else { + ItemDetailStore.SelectedIndex = -1; + } + } + + private void HandleItemChange(object sender, RoutedEventArgs e) { + if (viewModel.SelectedItemIndex > -1) { + + GroceryItem selectedItem = viewModel.GroceryList + [viewModel.SelectedItemIndex]; + + if (sender == ItemDetailName) { + selectedItem.Name = ItemDetailName.Text; + + } else if (sender == ItemDetailQuantity) { + int intVal; + bool parsed = Int32.TryParse(ItemDetailQuantity.Text, + out intVal); + if (parsed) { + selectedItem.Quantity = intVal; + } + } else if (sender == ItemDetailStore) { + string store = (String)((ComboBox)sender).SelectedItem; + + if (store != null) { + viewModel.GroceryList + [viewModel.SelectedItemIndex].Store = store; + } + } + } + } + } +} diff --git a/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ListPage.xaml b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ListPage.xaml new file mode 100644 index 0000000..b40d7c1 --- /dev/null +++ b/Source Code/Chapter 3/GrocerApp/GrocerApp/Pages/ListPage.xaml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs b/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs new file mode 100644 index 0000000..ed84b26 --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs @@ -0,0 +1,29 @@ +using System; +using GrocerApp.Data; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace GrocerApp.Flyouts { + public sealed partial class AddItemFlyout : UserControl { + + public AddItemFlyout() { + this.InitializeComponent(); + } + + public void Show(Page page, AppBar appbar, Button button) { + AddItemPopup.IsOpen = true; + FlyoutHelper.ShowRelativeToAppBar(AddItemPopup, page, appbar, button); + } + + private void AddButtonClick(object sender, RoutedEventArgs e) { + + ((ViewModel)DataContext).GroceryList.Add(new GroceryItem { + Name = ItemName.Text, + Quantity = Int32.Parse(ItemQuantity.Text), + Store = ItemStore.SelectedItem.ToString() + }); + + AddItemPopup.IsOpen = false; + } + } +} diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs b/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs new file mode 100644 index 0000000..23de22a --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs @@ -0,0 +1,38 @@ +using System; +using Windows.Foundation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; + +namespace GrocerApp.Flyouts { + class FlyoutHelper { + + public static void ShowRelativeToAppBar(Popup popup, Page page, + AppBar appbar, Button button) { + + Func getOffset = + delegate(UIElement control1, UIElement control2) { + return control1.TransformToVisual(control2) + .TransformPoint(new Point(0, 0)); + }; + + Point popupOffset = getOffset(popup, page); + + Point buttonOffset = getOffset(button, page); + popup.HorizontalOffset = buttonOffset.X - popupOffset.X + - (popup.ActualWidth / 2) + (button.ActualWidth / 2); + popup.VerticalOffset = getOffset(appbar, page).Y + - popupOffset.Y - popup.ActualHeight; + + if (popupOffset.X + popup.HorizontalOffset + + popup.ActualWidth > page.ActualWidth) { + + popup.HorizontalOffset = page.ActualWidth + - popupOffset.X - popup.ActualWidth; + } else if (popup.HorizontalOffset + popupOffset.X < 0) { + popup.HorizontalOffset = -popupOffset.X; + } + } + + } +} diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml b/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml new file mode 100644 index 0000000..7edbf11 --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs b/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs new file mode 100644 index 0000000..081555e --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs @@ -0,0 +1,20 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace GrocerApp.Flyouts { + public sealed partial class HomeZipCodeFlyout : UserControl { + + public HomeZipCodeFlyout() { + this.InitializeComponent(); + } + + public void Show(Page page, AppBar appbar, Button button) { + HomeZipCodePopup.IsOpen = true; + FlyoutHelper.ShowRelativeToAppBar(HomeZipCodePopup, page, appbar, button); + } + + private void OKButtonClick(object sender, RoutedEventArgs e) { + HomeZipCodePopup.IsOpen = false; + } + } +} diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp.csproj b/Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp.csproj new file mode 100644 index 0000000..f0b617f --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp.csproj @@ -0,0 +1,205 @@ + + + + + Debug + AnyCPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2} + AppContainerExe + Properties + GrocerApp + GrocerApp + en-US + 512 + {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + GrocerApp_TemporaryKey.pfx + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE + prompt + 4 + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + ARM + false + prompt + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x64 + false + prompt + true + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x86 + false + prompt + true + + + + + + + App.xaml + + + + + AddItemFlyout.xaml + + + + HomeZipCodeFlyout.xaml + + + DetailPage.xaml + + + ItemDetail.xaml + + + ListPage.xaml + + + MainPage.xaml + + + NoItemSelected.xaml + + + + + + Designer + + + + + + + + + + + + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + PreserveNewest + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + 11.0 + + + + \ No newline at end of file diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp.csproj.user b/Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp.csproj.user new file mode 100644 index 0000000..e98010e --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp.csproj.user @@ -0,0 +1,6 @@ + + + + False + + \ No newline at end of file diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx b/Source Code/Chapter 4/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..27d6028a1b1fd721c26a8556804215fc7efbcf2e GIT binary patch literal 2504 zcmY+E2{hDe8^Hgw&txfEF_EQw#YnB+vKG_G8eHpvLq_Q<6OI;DJBx^>p zlx%ZJE(Te$R}w||rq1`>d+vG9^FGh>dzSY-?>X;-p`c!ZK@bcD6$eL2Ctpb3;Q%2( z#S~N!l!EeOVIqbC+x=GvwhE=dKCti{OQzv$|Epp@0su)8-br)F+!EM|SfhY@z(D}!VAO3)28?rQ*`x1J^Abcs zc1%2%c@ua-=7=gkVN|gy6ILx3xp8whRe`LBj9W^ikt5FdnkKec+ZkB|B*C=tjX8ga zL-%o<8u(*PjvK#U*QEGJWXD$3&pxpkQ-3pDvAV8=`7@eW=hCo6e#k|}7PJ$7)3SP- z`Mi=Kw=GZ*AX)z5ThMzAm@+W1&|B5+9Co*V^(7h`)v9aX zGj+w_tvmP0;s(Hd3G{xBm>cj`dVTxQf$h!bveIhfULVScA)f}w;l`)F_4g>nG_PIN zFNuprR`Y>_wQ*0Sc=Xbm3{CrMII7DTW8b{^VKWPk8tkOa-*_N4CyXSQ4bY7r`U*Rx z?T^;g(9aRhq9?_N^K|Gb+*S;G0aE%9T#xD+wIrF*tO6@OV>5>&pDc8msiA%^gN#7s z+4z`R32tHPDkdUj^MS3<7cC?a3qQW~WY8 z-iFx8EyL|JC;zY#exS6+E8B?3L5_O5d z-F~d&{!u#!ws?{TfWhh)sm0geVf$R8U))a>FiU>q8);20c#pLUzFM{)f4EUA;6H&# zZxd#oyQiRAs`w!n=eS4b)GSpS-&SU;1X5ssbqYS;O7QX!8+_H43a#_fYGa55szi?znHp`FbjW+o4urPCGp68to9*o+Sl}{Ze zvhleZvtYAlxVYu0bPgx``jGC#B~jL^DRga`TG`)My`Jrv*>S`W;e9M?Eo4g|wA(3` zT_Jc?xE%a&BGktRK;K9P@O-WukmyoH$iS_p_ON=Z{E% z)g8v_Go{Kc(yb)+RJ#{g|K9M3KpwH^Z$g`2a(kjnLmC-k*4`ie6ot$tRS1vG<4n{g z^K7H=j|Rxt_|2Oa3GMy0$4tY)ieAcEc$U0{QKg=!+Zo;wPABMrbpkc|$Q@`QcH#I#KofrRF^< z%KdfQWg7C%tOQ5SInYd1Vd)f~pPatD0FpSdTL(9C!-F_XJr_8tHOZs*rqZoQ3htEM@U z>L5*85*KI%lVuFVxD2NZJ!n|sC<@g18_h$_kT zoT7~kTJKMr=si0@L(8TDMfK0C;~vNN4_H_D`X{T~ZXSA%f`mRAG34gFokt?$CiD_q z@6#}97-0+o4wK=8fYDIit{4#U + + + + GrocerApp + adam + Assets\StoreLogo.png + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/DetailPage.xaml b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/DetailPage.xaml new file mode 100644 index 0000000..4d7ca1f --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/DetailPage.xaml @@ -0,0 +1,79 @@ + + + + + + + + + + + + 0 + + + + + + + + + + + + * + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs new file mode 100644 index 0000000..8075d1e --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs @@ -0,0 +1,37 @@ +using Windows.UI.ViewManagement; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace GrocerApp.Pages { + public sealed partial class DetailPage : Page { + + public DetailPage() { + this.InitializeComponent(); + + SizeChanged += DetailPage_SizeChanged; + } + + void DetailPage_SizeChanged(object sender, SizeChangedEventArgs e) { + //if (ApplicationView.Value == ApplicationViewState.Snapped) { + // GridLayout.ColumnDefinitions[0].Width + // = new GridLength(0); + //} else { + // GridLayout.ColumnDefinitions[0].Width + // = new GridLength(1, GridUnitType.Star); + //} + + string stateName = ApplicationView.Value == + ApplicationViewState.Snapped ? "Snapped" : "Others"; + VisualStateManager.GoToState(this, stateName, false); + + } + + private void HandleButtonClick(object sender, RoutedEventArgs e) { + Windows.UI.ViewManagement.ApplicationView.TryUnsnap(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) { + } + } +} diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ItemDetail.xaml b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ItemDetail.xaml new file mode 100644 index 0000000..d5be62b --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ItemDetail.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs new file mode 100644 index 0000000..00b0b90 --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs @@ -0,0 +1,73 @@ +using GrocerApp.Data; +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace GrocerApp.Pages { + + public sealed partial class ItemDetail : Page { + private ViewModel viewModel; + + public ItemDetail() { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) { + + viewModel = e.Parameter as ViewModel; + this.DataContext = viewModel; + + viewModel.PropertyChanged += (sender, eventArgs) => { + if (eventArgs.PropertyName == "SelectedItemIndex") { + if (viewModel.SelectedItemIndex == -1) { + SetItemDetail(null); + } else { + SetItemDetail(viewModel.GroceryList + [viewModel.SelectedItemIndex]); + } + } + }; + SetItemDetail(viewModel.GroceryList[viewModel.SelectedItemIndex]); + } + + private void SetItemDetail(GroceryItem item) { + ItemDetailName.Text = (item == null) ? "" : item.Name; + ItemDetailQuantity.Text = (item == null) ? "" + : item.Quantity.ToString(); + + if (item != null) { + ItemDetailStore.SelectedItem = item.Store; + } else { + ItemDetailStore.SelectedIndex = -1; + } + } + + private void HandleItemChange(object sender, RoutedEventArgs e) { + if (viewModel.SelectedItemIndex > -1) { + + GroceryItem selectedItem = viewModel.GroceryList + [viewModel.SelectedItemIndex]; + + if (sender == ItemDetailName) { + selectedItem.Name = ItemDetailName.Text; + + } else if (sender == ItemDetailQuantity) { + int intVal; + bool parsed = Int32.TryParse(ItemDetailQuantity.Text, + out intVal); + if (parsed) { + selectedItem.Quantity = intVal; + } + } else if (sender == ItemDetailStore) { + string store = (String)((ComboBox)sender).SelectedItem; + + if (store != null) { + viewModel.GroceryList + [viewModel.SelectedItemIndex].Store = store; + } + } + } + } + } +} diff --git a/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ListPage.xaml b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ListPage.xaml new file mode 100644 index 0000000..b40d7c1 --- /dev/null +++ b/Source Code/Chapter 4/GrocerApp/GrocerApp/Pages/ListPage.xaml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs b/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs new file mode 100644 index 0000000..ed84b26 --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/AddItemFlyout.xaml.cs @@ -0,0 +1,29 @@ +using System; +using GrocerApp.Data; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace GrocerApp.Flyouts { + public sealed partial class AddItemFlyout : UserControl { + + public AddItemFlyout() { + this.InitializeComponent(); + } + + public void Show(Page page, AppBar appbar, Button button) { + AddItemPopup.IsOpen = true; + FlyoutHelper.ShowRelativeToAppBar(AddItemPopup, page, appbar, button); + } + + private void AddButtonClick(object sender, RoutedEventArgs e) { + + ((ViewModel)DataContext).GroceryList.Add(new GroceryItem { + Name = ItemName.Text, + Quantity = Int32.Parse(ItemQuantity.Text), + Store = ItemStore.SelectedItem.ToString() + }); + + AddItemPopup.IsOpen = false; + } + } +} diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs b/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs new file mode 100644 index 0000000..23de22a --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/FlyoutHelper.cs @@ -0,0 +1,38 @@ +using System; +using Windows.Foundation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; + +namespace GrocerApp.Flyouts { + class FlyoutHelper { + + public static void ShowRelativeToAppBar(Popup popup, Page page, + AppBar appbar, Button button) { + + Func getOffset = + delegate(UIElement control1, UIElement control2) { + return control1.TransformToVisual(control2) + .TransformPoint(new Point(0, 0)); + }; + + Point popupOffset = getOffset(popup, page); + + Point buttonOffset = getOffset(button, page); + popup.HorizontalOffset = buttonOffset.X - popupOffset.X + - (popup.ActualWidth / 2) + (button.ActualWidth / 2); + popup.VerticalOffset = getOffset(appbar, page).Y + - popupOffset.Y - popup.ActualHeight; + + if (popupOffset.X + popup.HorizontalOffset + + popup.ActualWidth > page.ActualWidth) { + + popup.HorizontalOffset = page.ActualWidth + - popupOffset.X - popup.ActualWidth; + } else if (popup.HorizontalOffset + popupOffset.X < 0) { + popup.HorizontalOffset = -popupOffset.X; + } + } + + } +} diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml b/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml new file mode 100644 index 0000000..7edbf11 --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs b/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs new file mode 100644 index 0000000..081555e --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/Flyouts/HomeZipCodeFlyout.xaml.cs @@ -0,0 +1,20 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; + +namespace GrocerApp.Flyouts { + public sealed partial class HomeZipCodeFlyout : UserControl { + + public HomeZipCodeFlyout() { + this.InitializeComponent(); + } + + public void Show(Page page, AppBar appbar, Button button) { + HomeZipCodePopup.IsOpen = true; + FlyoutHelper.ShowRelativeToAppBar(HomeZipCodePopup, page, appbar, button); + } + + private void OKButtonClick(object sender, RoutedEventArgs e) { + HomeZipCodePopup.IsOpen = false; + } + } +} diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp.csproj b/Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp.csproj new file mode 100644 index 0000000..96e2d20 --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp.csproj @@ -0,0 +1,206 @@ + + + + + Debug + AnyCPU + {2EB6BE9C-103F-4FEE-B353-B58F06CABCF2} + AppContainerExe + Properties + GrocerApp + GrocerApp + en-US + 512 + {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + GrocerApp_TemporaryKey.pfx + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE + prompt + 4 + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + ARM + false + prompt + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x64 + false + prompt + true + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x86 + false + prompt + true + + + + + + + App.xaml + + + + + + AddItemFlyout.xaml + + + + HomeZipCodeFlyout.xaml + + + DetailPage.xaml + + + ItemDetail.xaml + + + ListPage.xaml + + + MainPage.xaml + + + NoItemSelected.xaml + + + + + + Designer + + + + + + + + + + + + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + PreserveNewest + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + 11.0 + + + + \ No newline at end of file diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp.csproj.user b/Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp.csproj.user new file mode 100644 index 0000000..b29230c --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp.csproj.user @@ -0,0 +1,6 @@ + + + + True + + \ No newline at end of file diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx b/Source Code/Chapter 5/GrocerApp/GrocerApp/GrocerApp_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..27d6028a1b1fd721c26a8556804215fc7efbcf2e GIT binary patch literal 2504 zcmY+E2{hDe8^Hgw&txfEF_EQw#YnB+vKG_G8eHpvLq_Q<6OI;DJBx^>p zlx%ZJE(Te$R}w||rq1`>d+vG9^FGh>dzSY-?>X;-p`c!ZK@bcD6$eL2Ctpb3;Q%2( z#S~N!l!EeOVIqbC+x=GvwhE=dKCti{OQzv$|Epp@0su)8-br)F+!EM|SfhY@z(D}!VAO3)28?rQ*`x1J^Abcs zc1%2%c@ua-=7=gkVN|gy6ILx3xp8whRe`LBj9W^ikt5FdnkKec+ZkB|B*C=tjX8ga zL-%o<8u(*PjvK#U*QEGJWXD$3&pxpkQ-3pDvAV8=`7@eW=hCo6e#k|}7PJ$7)3SP- z`Mi=Kw=GZ*AX)z5ThMzAm@+W1&|B5+9Co*V^(7h`)v9aX zGj+w_tvmP0;s(Hd3G{xBm>cj`dVTxQf$h!bveIhfULVScA)f}w;l`)F_4g>nG_PIN zFNuprR`Y>_wQ*0Sc=Xbm3{CrMII7DTW8b{^VKWPk8tkOa-*_N4CyXSQ4bY7r`U*Rx z?T^;g(9aRhq9?_N^K|Gb+*S;G0aE%9T#xD+wIrF*tO6@OV>5>&pDc8msiA%^gN#7s z+4z`R32tHPDkdUj^MS3<7cC?a3qQW~WY8 z-iFx8EyL|JC;zY#exS6+E8B?3L5_O5d z-F~d&{!u#!ws?{TfWhh)sm0geVf$R8U))a>FiU>q8);20c#pLUzFM{)f4EUA;6H&# zZxd#oyQiRAs`w!n=eS4b)GSpS-&SU;1X5ssbqYS;O7QX!8+_H43a#_fYGa55szi?znHp`FbjW+o4urPCGp68to9*o+Sl}{Ze zvhleZvtYAlxVYu0bPgx``jGC#B~jL^DRga`TG`)My`Jrv*>S`W;e9M?Eo4g|wA(3` zT_Jc?xE%a&BGktRK;K9P@O-WukmyoH$iS_p_ON=Z{E% z)g8v_Go{Kc(yb)+RJ#{g|K9M3KpwH^Z$g`2a(kjnLmC-k*4`ie6ot$tRS1vG<4n{g z^K7H=j|Rxt_|2Oa3GMy0$4tY)ieAcEc$U0{QKg=!+Zo;wPABMrbpkc|$Q@`QcH#I#KofrRF^< z%KdfQWg7C%tOQ5SInYd1Vd)f~pPatD0FpSdTL(9C!-F_XJr_8tHOZs*rqZoQ3htEM@U z>L5*85*KI%lVuFVxD2NZJ!n|sC<@g18_h$_kT zoT7~kTJKMr=si0@L(8TDMfK0C;~vNN4_H_D`X{T~ZXSA%f`mRAG34gFokt?$CiD_q z@6#}97-0+o4wK=8fYDIit{4#U + + + + GrocerApp + adam + Assets\StoreLogo.png + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/DetailPage.xaml b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/DetailPage.xaml new file mode 100644 index 0000000..4d7ca1f --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/DetailPage.xaml @@ -0,0 +1,79 @@ + + + + + + + + + + + + 0 + + + + + + + + + + + + * + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs new file mode 100644 index 0000000..8075d1e --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/DetailPage.xaml.cs @@ -0,0 +1,37 @@ +using Windows.UI.ViewManagement; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace GrocerApp.Pages { + public sealed partial class DetailPage : Page { + + public DetailPage() { + this.InitializeComponent(); + + SizeChanged += DetailPage_SizeChanged; + } + + void DetailPage_SizeChanged(object sender, SizeChangedEventArgs e) { + //if (ApplicationView.Value == ApplicationViewState.Snapped) { + // GridLayout.ColumnDefinitions[0].Width + // = new GridLength(0); + //} else { + // GridLayout.ColumnDefinitions[0].Width + // = new GridLength(1, GridUnitType.Star); + //} + + string stateName = ApplicationView.Value == + ApplicationViewState.Snapped ? "Snapped" : "Others"; + VisualStateManager.GoToState(this, stateName, false); + + } + + private void HandleButtonClick(object sender, RoutedEventArgs e) { + Windows.UI.ViewManagement.ApplicationView.TryUnsnap(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) { + } + } +} diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ItemDetail.xaml b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ItemDetail.xaml new file mode 100644 index 0000000..d5be62b --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ItemDetail.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs new file mode 100644 index 0000000..00b0b90 --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ItemDetail.xaml.cs @@ -0,0 +1,73 @@ +using GrocerApp.Data; +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace GrocerApp.Pages { + + public sealed partial class ItemDetail : Page { + private ViewModel viewModel; + + public ItemDetail() { + this.InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) { + + viewModel = e.Parameter as ViewModel; + this.DataContext = viewModel; + + viewModel.PropertyChanged += (sender, eventArgs) => { + if (eventArgs.PropertyName == "SelectedItemIndex") { + if (viewModel.SelectedItemIndex == -1) { + SetItemDetail(null); + } else { + SetItemDetail(viewModel.GroceryList + [viewModel.SelectedItemIndex]); + } + } + }; + SetItemDetail(viewModel.GroceryList[viewModel.SelectedItemIndex]); + } + + private void SetItemDetail(GroceryItem item) { + ItemDetailName.Text = (item == null) ? "" : item.Name; + ItemDetailQuantity.Text = (item == null) ? "" + : item.Quantity.ToString(); + + if (item != null) { + ItemDetailStore.SelectedItem = item.Store; + } else { + ItemDetailStore.SelectedIndex = -1; + } + } + + private void HandleItemChange(object sender, RoutedEventArgs e) { + if (viewModel.SelectedItemIndex > -1) { + + GroceryItem selectedItem = viewModel.GroceryList + [viewModel.SelectedItemIndex]; + + if (sender == ItemDetailName) { + selectedItem.Name = ItemDetailName.Text; + + } else if (sender == ItemDetailQuantity) { + int intVal; + bool parsed = Int32.TryParse(ItemDetailQuantity.Text, + out intVal); + if (parsed) { + selectedItem.Quantity = intVal; + } + } else if (sender == ItemDetailStore) { + string store = (String)((ComboBox)sender).SelectedItem; + + if (store != null) { + viewModel.GroceryList + [viewModel.SelectedItemIndex].Store = store; + } + } + } + } + } +} diff --git a/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ListPage.xaml b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ListPage.xaml new file mode 100644 index 0000000..b40d7c1 --- /dev/null +++ b/Source Code/Chapter 5/GrocerApp/GrocerApp/Pages/ListPage.xaml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +