From c5e892d88e21e68b8f2fbc12b873738c80887985 Mon Sep 17 00:00:00 2001 From: Nick Randolph Date: Thu, 6 Aug 2020 13:12:08 +1000 Subject: [PATCH 01/23] Adding uno --- .../MvvmSample.Core/Helpers/MarkdownHelper.cs | 27 + .../MvvmSample.Core/MvvmSample.Core.csproj | 25 + .../AsyncRelayCommandPageViewModel.cs | 22 + .../ViewModels/IocPageViewModel.cs | 6 + .../ViewModels/MessengerPageViewModel.cs | 85 +++ .../ObservableObjectPageViewModel.cs | 37 ++ .../ViewModels/RelayCommandPageViewModel.cs | 35 ++ .../ViewModels/SamplePageViewModel.cs | 58 ++ samples/MvvmSample/MvvmSample.sln | 415 ++++++++++++++ .../MvvmSample.Droid/Assets/AboutAssets.txt | 19 + .../Assets/Fonts/winjs-symbols.ttf | Bin 0 -> 53776 bytes .../MvvmSample/MvvmSample.Droid/Main.cs | 43 ++ .../MvvmSample.Droid/MainActivity.cs | 18 + .../MvvmSample.Droid/MvvmSample.Droid.csproj | 105 ++++ .../Properties/AndroidManifest.xml | 5 + .../Properties/AssemblyInfo.cs | 30 + .../Resources/AboutResources.txt | 44 ++ .../Resources/drawable/Icon.png | Bin 0 -> 4147 bytes .../Resources/values/Strings.xml | 5 + .../Resources/values/Styles.xml | 12 + .../MvvmSample/MvvmSample.Shared/App.xaml | 33 ++ .../MvvmSample/MvvmSample.Shared/App.xaml.cs | 183 ++++++ .../Assets/LockScreenLogo.scale-200.png | Bin 0 -> 1430 bytes .../MvvmSample.Shared/Assets/SharedAssets.md | 34 ++ .../Assets/SplashScreen.scale-200.png | Bin 0 -> 7700 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 2937 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 1647 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1255 bytes .../MvvmSample.Shared/Assets/StoreLogo.png | Bin 0 -> 1451 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 3204 bytes .../Assets/docs/AsyncRelayCommand.md | 87 +++ .../Assets/docs/Introduction.md | 69 +++ .../MvvmSample.Shared/Assets/docs/Ioc.md | 89 +++ .../Assets/docs/Messenger.md | 120 ++++ .../Assets/docs/ObservableObject.md | 100 ++++ .../Assets/docs/ObservableRecipient.md | 71 +++ .../Assets/docs/RelayCommand.md | 83 +++ .../Controls/InteractiveSample.cs | 47 ++ .../Controls/InteractiveSample.xaml | 56 ++ .../Helpers/TitleBarHelper.cs | 43 ++ .../MvvmSample.Shared/MainPage.xaml | 13 + .../MvvmSample.Shared/MainPage.xaml.cs | 30 + .../MvvmSample.Shared.projitems | 123 ++++ .../MvvmSample.Shared.shproj | 13 + .../MvvmSample/MvvmSample.Shared/Shell.xaml | 194 +++++++ .../MvvmSample.Shared/Shell.xaml.cs | 129 +++++ .../Strings/en/Resources.resw | 123 ++++ .../Views/AsyncRelayCommandPage.xaml | 90 +++ .../Views/AsyncRelayCommandPage.xaml.cs | 40 ++ .../Views/IntroductionPage.xaml | 28 + .../Views/IntroductionPage.xaml.cs | 15 + .../MvvmSample.Shared/Views/IocPage.xaml | 29 + .../MvvmSample.Shared/Views/IocPage.xaml.cs | 15 + .../Views/MessengerPage.xaml | 28 + .../Views/MessengerPage.xaml.cs | 15 + .../Views/MessengerRequestPage.xaml | 92 +++ .../Views/MessengerRequestPage.xaml.cs | 30 + .../Views/MessengerSendPage.xaml | 122 ++++ .../Views/MessengerSendPage.xaml.cs | 30 + .../Views/ObservableObjectPage.xaml | 107 ++++ .../Views/ObservableObjectPage.xaml.cs | 15 + .../Views/RelayCommandPage.xaml | 76 +++ .../Views/RelayCommandPage.xaml.cs | 15 + .../Assets/lockscreenlogo.scale-200.png | Bin 0 -> 1430 bytes .../Assets/splashscreen.scale-200.png | Bin 0 -> 7700 bytes .../Assets/square150x150logo.scale-200.png | Bin 0 -> 2937 bytes .../Assets/square44x44logo.scale-200.png | Bin 0 -> 1647 bytes .../MvvmSample.UWP/Assets/storelogo.png | Bin 0 -> 1451 bytes .../Assets/wide310x150logo.scale-200.png | Bin 0 -> 3204 bytes .../MvvmSample.UWP/MvvmSample.UWP.csproj | 179 ++++++ .../MvvmSample.UWP/Package.appxmanifest | 49 ++ .../MvvmSample.UWP/Properties/AssemblyInfo.cs | 29 + .../MvvmSample.UWP/Properties/Default.rd.xml | 31 + .../MvvmSample.Wasm/Assets/SplashScreen.png | Bin 0 -> 7700 bytes .../MvvmSample.Wasm/LinkerConfig.xml | 9 + .../MvvmSample.Wasm/MvvmSample.Wasm.csproj | 54 ++ .../MvvmSample/MvvmSample.Wasm/Program.cs | 17 + .../Properties/launchSettings.json | 27 + .../MvvmSample.Wasm/WasmCSS/Fonts.css | 10 + .../WasmScripts/AppManifest.js | 7 + .../MvvmSample.Wasm/wwwroot/web.config | 78 +++ .../MvvmSample.iOS/Entitlements.plist | 6 + .../MvvmSample/MvvmSample.iOS/Info.plist | 55 ++ .../MvvmSample.iOS/LaunchScreen.storyboard | 52 ++ .../MvvmSample/MvvmSample.iOS/Main.cs | 15 + .../AppIcons.appiconset/Contents.json | 106 ++++ .../AppIcons.appiconset/iPad-76x76@2x.png | Bin 0 -> 1218 bytes .../AppIcons.appiconset/iPad-84x84@2x.png | Bin 0 -> 1317 bytes .../AppIcons.appiconset/iPhone-20x20@2x.png | Bin 0 -> 224 bytes .../AppIcons.appiconset/iPhone-20x20@3x.png | Bin 0 -> 308 bytes .../AppIcons.appiconset/iPhone-40x40@3x.png | Bin 0 -> 971 bytes .../AppIcons.appiconset/iPhone-60x60@2x.png | Bin 0 -> 971 bytes .../ios-marketing-1024x1024@1x.png | Bin 0 -> 11313 bytes .../LaunchImages.launchimage/Contents.json | 58 ++ .../MvvmSample.iOS/MvvmSample.iOS.csproj | 158 ++++++ .../MvvmSample.iOS/Properties/AssemblyInfo.cs | 36 ++ .../Resources/Default-568h@2x.png | Bin 0 -> 2215 bytes .../Resources/Fonts/winjs-symbols.ttf | Bin 0 -> 53776 bytes .../Resources/SplashScreen@2x.png | Bin 0 -> 36520 bytes .../Resources/SplashScreen@3x.png | Bin 0 -> 59332 bytes .../AppIcon.appiconset/AppIcon-128.png | Bin 0 -> 23243 bytes .../AppIcon.appiconset/AppIcon-128@2x.png | Bin 0 -> 36887 bytes .../AppIcon.appiconset/AppIcon-16.png | Bin 0 -> 15188 bytes .../AppIcon.appiconset/AppIcon-16@2x.png | Bin 0 -> 16188 bytes .../AppIcon.appiconset/AppIcon-256.png | Bin 0 -> 37404 bytes .../AppIcon.appiconset/AppIcon-256@2x.png | Bin 0 -> 79023 bytes .../AppIcon.appiconset/AppIcon-32.png | Bin 0 -> 16183 bytes .../AppIcon.appiconset/AppIcon-32@2x.png | Bin 0 -> 18284 bytes .../AppIcon.appiconset/AppIcon-512.png | Bin 0 -> 78932 bytes .../AppIcon.appiconset/AppIcon-512@2x.png | Bin 0 -> 182243 bytes .../AppIcon.appiconset/Contents.json | 68 +++ .../Assets.xcassets/Contents.json | 6 + .../unologo.imageset/Contents.json | 528 ++++++++++++++++++ .../unologo.imageset/unoplatform.jpg | Bin 0 -> 18136 bytes .../MvvmSample.macOS/Entitlements.plist | 7 + .../MvvmSample/MvvmSample.macOS/Info.plist | 32 ++ .../MvvmSample/MvvmSample.macOS/Main.cs | 15 + .../MvvmSample.macOS/MvvmSample.macOS.csproj | 130 +++++ .../Properties/AssemblyInfo.cs | 36 ++ .../Resources/Fonts/winjs-symbols.ttf | Bin 0 -> 53776 bytes samples/MvvmSample/global.json | 5 + samples/MvvmSample/nuget.config | 6 + 122 files changed, 5187 insertions(+) create mode 100644 samples/MvvmSample/MvvmSample.Core/Helpers/MarkdownHelper.cs create mode 100644 samples/MvvmSample/MvvmSample.Core/MvvmSample.Core.csproj create mode 100644 samples/MvvmSample/MvvmSample.Core/ViewModels/AsyncRelayCommandPageViewModel.cs create mode 100644 samples/MvvmSample/MvvmSample.Core/ViewModels/IocPageViewModel.cs create mode 100644 samples/MvvmSample/MvvmSample.Core/ViewModels/MessengerPageViewModel.cs create mode 100644 samples/MvvmSample/MvvmSample.Core/ViewModels/ObservableObjectPageViewModel.cs create mode 100644 samples/MvvmSample/MvvmSample.Core/ViewModels/RelayCommandPageViewModel.cs create mode 100644 samples/MvvmSample/MvvmSample.Core/ViewModels/SamplePageViewModel.cs create mode 100644 samples/MvvmSample/MvvmSample.sln create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/Assets/AboutAssets.txt create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/Assets/Fonts/winjs-symbols.ttf create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/Main.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/MainActivity.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/MvvmSample.Droid.csproj create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/Properties/AndroidManifest.xml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/Properties/AssemblyInfo.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/AboutResources.txt create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/drawable/Icon.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/values/Strings.xml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/values/Styles.xml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/App.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/App.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/LockScreenLogo.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/SharedAssets.md create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/SplashScreen.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Square150x150Logo.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Square44x44Logo.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/StoreLogo.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Wide310x150Logo.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/docs/AsyncRelayCommand.md create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/docs/Introduction.md create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/docs/Ioc.md create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/docs/Messenger.md create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/docs/ObservableObject.md create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/docs/ObservableRecipient.md create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/docs/RelayCommand.md create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Controls/InteractiveSample.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Controls/InteractiveSample.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Helpers/TitleBarHelper.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/MainPage.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/MainPage.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/MvvmSample.Shared.projitems create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/MvvmSample.Shared.shproj create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Shell.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Shell.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Strings/en/Resources.resw create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/AsyncRelayCommandPage.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/AsyncRelayCommandPage.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/IntroductionPage.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/IntroductionPage.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/IocPage.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/IocPage.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/MessengerPage.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/MessengerPage.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/MessengerRequestPage.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/MessengerRequestPage.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/MessengerSendPage.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/MessengerSendPage.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/ObservableObjectPage.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/ObservableObjectPage.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/RelayCommandPage.xaml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Shared/Views/RelayCommandPage.xaml.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/Assets/lockscreenlogo.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/Assets/splashscreen.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/Assets/square150x150logo.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/Assets/square44x44logo.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/Assets/storelogo.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/Assets/wide310x150logo.scale-200.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/MvvmSample.UWP.csproj create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/Package.appxmanifest create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/Properties/AssemblyInfo.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.UWP/Properties/Default.rd.xml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Wasm/Assets/SplashScreen.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Wasm/LinkerConfig.xml create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Wasm/MvvmSample.Wasm.csproj create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Wasm/Program.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Wasm/Properties/launchSettings.json create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Wasm/WasmCSS/Fonts.css create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Wasm/WasmScripts/AppManifest.js create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.Wasm/wwwroot/web.config create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Entitlements.plist create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Info.plist create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/LaunchScreen.storyboard create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Main.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Media.xcassets/AppIcons.appiconset/Contents.json create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Media.xcassets/AppIcons.appiconset/iPad-76x76@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Media.xcassets/AppIcons.appiconset/iPad-84x84@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Media.xcassets/AppIcons.appiconset/iPhone-20x20@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Media.xcassets/AppIcons.appiconset/iPhone-20x20@3x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Media.xcassets/AppIcons.appiconset/iPhone-40x40@3x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Media.xcassets/AppIcons.appiconset/iPhone-60x60@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Media.xcassets/AppIcons.appiconset/ios-marketing-1024x1024@1x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Media.xcassets/LaunchImages.launchimage/Contents.json create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/MvvmSample.iOS.csproj create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Properties/AssemblyInfo.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Resources/Default-568h@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Resources/Fonts/winjs-symbols.ttf create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Resources/SplashScreen@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.iOS/Resources/SplashScreen@3x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-128.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-128@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-16.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-16@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-256.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-256@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-32.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-32@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-512.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/Contents.json create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/unologo.imageset/Contents.json create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Assets.xcassets/unologo.imageset/unoplatform.jpg create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Entitlements.plist create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Info.plist create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Main.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/MvvmSample.macOS.csproj create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Properties/AssemblyInfo.cs create mode 100644 samples/MvvmSample/MvvmSample/MvvmSample.macOS/Resources/Fonts/winjs-symbols.ttf create mode 100644 samples/MvvmSample/global.json create mode 100644 samples/MvvmSample/nuget.config diff --git a/samples/MvvmSample/MvvmSample.Core/Helpers/MarkdownHelper.cs b/samples/MvvmSample/MvvmSample.Core/Helpers/MarkdownHelper.cs new file mode 100644 index 0000000..ffa319a --- /dev/null +++ b/samples/MvvmSample/MvvmSample.Core/Helpers/MarkdownHelper.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; + +namespace MvvmSampleUwp.Helpers +{ + /// + /// A simple class to help with basic operations on markdown documents. + /// + public static class MarkdownHelper + { + /// + /// Gets all the paragraphs in a given markdown document. + /// + /// The input markdown document. + /// The raw paragraphs from . + public static IReadOnlyDictionary GetParagraphs(string text) + { + return + Regex.Matches(text, @"(#+ ([^\n]+)[^#]+)", RegexOptions.Singleline) + .OfType() + .ToDictionary( + m => m.Groups[2].Value.Trim().Replace("<", "<"), + m => m.Groups[1].Value.Trim().Replace("<", "<").Replace("[!WARNING]", "**WARNING:**")); + } + } +} diff --git a/samples/MvvmSample/MvvmSample.Core/MvvmSample.Core.csproj b/samples/MvvmSample/MvvmSample.Core/MvvmSample.Core.csproj new file mode 100644 index 0000000..24571dd --- /dev/null +++ b/samples/MvvmSample/MvvmSample.Core/MvvmSample.Core.csproj @@ -0,0 +1,25 @@ + + + + uap10.0.16299;netstandard2.0 + 8.0 + $(TargetFramework.StartsWith('uap')) + + + + UAP + 10.0.18362.0 + 10.0.16299.0 + 14 + 512 + false + + + + + + + + + + diff --git a/samples/MvvmSample/MvvmSample.Core/ViewModels/AsyncRelayCommandPageViewModel.cs b/samples/MvvmSample/MvvmSample.Core/ViewModels/AsyncRelayCommandPageViewModel.cs new file mode 100644 index 0000000..85db897 --- /dev/null +++ b/samples/MvvmSample/MvvmSample.Core/ViewModels/AsyncRelayCommandPageViewModel.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using Microsoft.Toolkit.Mvvm.Input; + +namespace MvvmSampleUwp.ViewModels +{ + public class AsyncRelayCommandPageViewModel : SamplePageViewModel + { + public AsyncRelayCommandPageViewModel() + { + DownloadTextCommand = new AsyncRelayCommand(DownloadTextAsync); + } + + public IAsyncRelayCommand DownloadTextCommand { get; } + + private async Task DownloadTextAsync() + { + await Task.Delay(3000); // Simulate a web request + + return "Hello world!"; + } + } +} diff --git a/samples/MvvmSample/MvvmSample.Core/ViewModels/IocPageViewModel.cs b/samples/MvvmSample/MvvmSample.Core/ViewModels/IocPageViewModel.cs new file mode 100644 index 0000000..b1dc570 --- /dev/null +++ b/samples/MvvmSample/MvvmSample.Core/ViewModels/IocPageViewModel.cs @@ -0,0 +1,6 @@ +namespace MvvmSampleUwp.ViewModels +{ + public class IocPageViewModel : SamplePageViewModel + { + } +} diff --git a/samples/MvvmSample/MvvmSample.Core/ViewModels/MessengerPageViewModel.cs b/samples/MvvmSample/MvvmSample.Core/ViewModels/MessengerPageViewModel.cs new file mode 100644 index 0000000..63546cc --- /dev/null +++ b/samples/MvvmSample/MvvmSample.Core/ViewModels/MessengerPageViewModel.cs @@ -0,0 +1,85 @@ +using Microsoft.Toolkit.Mvvm.ComponentModel; +using Microsoft.Toolkit.Mvvm.Messaging; +using Microsoft.Toolkit.Mvvm.Messaging.Messages; + +namespace MvvmSampleUwp.ViewModels +{ + public class MessengerPageViewModel : SamplePageViewModel + { + public UserSenderViewModel SenderViewModel { get; } = new UserSenderViewModel(); + + public UserReceiverViewModel ReceiverViewModel { get; } = new UserReceiverViewModel(); + + // Simple viewmodel for a module sending a username message + public class UserSenderViewModel : ObservableRecipient + { + private string username = "Bob"; + + public string Username + { + get => username; + private set => SetProperty(ref username, value); + } + + protected override void OnActivated() + { + Messenger.Register(this, m => m.Reply(Username)); + } + + public void SendUserMessage() + { + Username = Username == "Bob" ? "Alice" : "Bob"; + + Messenger.Send(new UsernameChangedMessage(Username)); + } + } + + // Simple viewmodel for a module receiving a username message + public class UserReceiverViewModel : ObservableRecipient + { + private string username = ""; + + public string Username + { + get => username; + private set => SetProperty(ref username, value); + } + + protected override void OnActivated() + { + Messenger.Register(this, m => Username = m.Value); + } + } + + private string username; + + public string Username + { + get => username; + private set => SetProperty(ref username, value); + } + + public void RequestCurrentUsername() + { + Username = Messenger.Default.Send(); + } + + public void ResetCurrentUsername() + { + Username = null; + } + + // A sample message with a username value + public sealed class UsernameChangedMessage : ValueChangedMessage + { + public UsernameChangedMessage(string value) : base(value) + { + } + } + + // A sample request message to get the current username + public sealed class CurrentUsernameRequestMessage : RequestMessage + { + } + } +} diff --git a/samples/MvvmSample/MvvmSample.Core/ViewModels/ObservableObjectPageViewModel.cs b/samples/MvvmSample/MvvmSample.Core/ViewModels/ObservableObjectPageViewModel.cs new file mode 100644 index 0000000..ad41834 --- /dev/null +++ b/samples/MvvmSample/MvvmSample.Core/ViewModels/ObservableObjectPageViewModel.cs @@ -0,0 +1,37 @@ +using System.Threading.Tasks; + +namespace MvvmSampleUwp.ViewModels +{ + public class ObservableObjectPageViewModel : SamplePageViewModel + { + private string name; + + /// + /// Gets or sets the name to display. + /// + public string Name + { + get => name; + set => SetProperty(ref name, value); + } + + private Task myTask; + + /// + /// Gets or sets the name to display. + /// + public Task MyTask + { + get => myTask; + private set => SetPropertyAndNotifyOnCompletion(ref myTask, () => myTask, value); + } + + /// + /// Simulates an asynchronous method. + /// + public void ReloadTask() + { + MyTask = Task.Delay(3000); + } + } +} diff --git a/samples/MvvmSample/MvvmSample.Core/ViewModels/RelayCommandPageViewModel.cs b/samples/MvvmSample/MvvmSample.Core/ViewModels/RelayCommandPageViewModel.cs new file mode 100644 index 0000000..1cb4839 --- /dev/null +++ b/samples/MvvmSample/MvvmSample.Core/ViewModels/RelayCommandPageViewModel.cs @@ -0,0 +1,35 @@ +using System.Windows.Input; +using Microsoft.Toolkit.Mvvm.Input; + +namespace MvvmSampleUwp.ViewModels +{ + public class RelayCommandPageViewModel : SamplePageViewModel + { + public RelayCommandPageViewModel() + { + IncrementCounterCommand = new RelayCommand(IncrementCounter); + } + + /// + /// Gets the responsible for incrementing . + /// + public ICommand IncrementCounterCommand { get; } + + private int counter; + + /// + /// Gets the current value of the counter. + /// + public int Counter + { + get => counter; + private set => SetProperty(ref counter, value); + } + + /// + /// Increments . + /// + private void IncrementCounter() => Counter++; + + } +} diff --git a/samples/MvvmSample/MvvmSample.Core/ViewModels/SamplePageViewModel.cs b/samples/MvvmSample/MvvmSample.Core/ViewModels/SamplePageViewModel.cs new file mode 100644 index 0000000..ac1ac72 --- /dev/null +++ b/samples/MvvmSample/MvvmSample.Core/ViewModels/SamplePageViewModel.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Windows.Storage; +using Microsoft.Toolkit.Mvvm.ComponentModel; +using Microsoft.Toolkit.Mvvm.Input; +using MvvmSampleUwp.Helpers; + +namespace MvvmSampleUwp.ViewModels +{ + /// + /// A base class for viewmodels for sample pages in the app. + /// + public class SamplePageViewModel : ObservableObject + { + public SamplePageViewModel() + { + LoadDocsCommand = new AsyncRelayCommand(LoadDocsAsync); + } + + /// + /// Gets the responsible for loading the source markdown docs. + /// + public IAsyncRelayCommand LoadDocsCommand { get; } + + private IReadOnlyDictionary texts; + + /// + /// Gets the markdown for a specified paragraph from the docs page. + /// + /// The key of the paragraph to retrieve. + /// The text of the specified paragraph, or . + public string GetParagraph(string key) + { + return texts != null && texts.TryGetValue(key, out var value) ? value : string.Empty; + } + + /// + /// Implements the logic for . + /// + /// The name of the docs file to load. + private async Task LoadDocsAsync(string name) + { + // Skip if the loading has already started + if (!(LoadDocsCommand.ExecutionTask is null)) return; + + var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/docs/{name}.md")); + using var stream = await file.OpenStreamForReadAsync(); + using var reader = new StreamReader(stream); + var text = await reader.ReadToEndAsync(); + + texts = MarkdownHelper.GetParagraphs(text); + + OnPropertyChanged(nameof(GetParagraph)); + } + } +} diff --git a/samples/MvvmSample/MvvmSample.sln b/samples/MvvmSample/MvvmSample.sln new file mode 100644 index 0000000..aa5eb4c --- /dev/null +++ b/samples/MvvmSample/MvvmSample.sln @@ -0,0 +1,415 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30323.103 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "MvvmSample.Shared", "MvvmSample\MvvmSample.Shared\MvvmSample.Shared.shproj", "{6279C845-92F8-4333-AB99-3D213163593C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvvmSample.Droid", "MvvmSample\MvvmSample.Droid\MvvmSample.Droid.csproj", "{17579977-DC58-416C-B1C3-AAAECEEBB41D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvvmSample.iOS", "MvvmSample\MvvmSample.iOS\MvvmSample.iOS.csproj", "{F1606259-0C33-4086-A4A7-F95C73ED46AF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvvmSample.UWP", "MvvmSample\MvvmSample.UWP\MvvmSample.UWP.csproj", "{455221B3-484E-412B-ADB1-D884CCA47383}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MvvmSample.Wasm", "MvvmSample\MvvmSample.Wasm\MvvmSample.Wasm.csproj", "{79389D18-22EF-4C88-B0E1-177FCC8400FD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvvmSample.macOS", "MvvmSample\MvvmSample.macOS\MvvmSample.macOS.csproj", "{60704335-4B3D-47D9-8684-BBEE1AC8EE88}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvvmSample.Core", "MvvmSample.Core\MvvmSample.Core.csproj", "{98CCBE56-376A-409D-93E6-6424337333A7}" +EndProject +Global + GlobalSection(SharedMSBuildProjectFiles) = preSolution + MvvmSample\MvvmSample.Shared\MvvmSample.Shared.projitems*{17579977-dc58-416c-b1c3-aaaeceebb41d}*SharedItemsImports = 4 + MvvmSample\MvvmSample.Shared\MvvmSample.Shared.projitems*{455221b3-484e-412b-adb1-d884cca47383}*SharedItemsImports = 4 + MvvmSample\MvvmSample.Shared\MvvmSample.Shared.projitems*{60704335-4b3d-47d9-8684-bbee1ac8ee88}*SharedItemsImports = 4 + MvvmSample\MvvmSample.Shared\MvvmSample.Shared.projitems*{6279c845-92f8-4333-ab99-3d213163593c}*SharedItemsImports = 13 + MvvmSample\MvvmSample.Shared\MvvmSample.Shared.projitems*{79389d18-22ef-4c88-b0e1-177fcc8400fd}*SharedItemsImports = 5 + MvvmSample\MvvmSample.Shared\MvvmSample.Shared.projitems*{f1606259-0c33-4086-a4a7-f95c73ed46af}*SharedItemsImports = 4 + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Ad-Hoc|Any CPU = Ad-Hoc|Any CPU + Ad-Hoc|ARM = Ad-Hoc|ARM + Ad-Hoc|ARM64 = Ad-Hoc|ARM64 + Ad-Hoc|iPhone = Ad-Hoc|iPhone + Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator + Ad-Hoc|x64 = Ad-Hoc|x64 + Ad-Hoc|x86 = Ad-Hoc|x86 + AppStore|Any CPU = AppStore|Any CPU + AppStore|ARM = AppStore|ARM + AppStore|ARM64 = AppStore|ARM64 + AppStore|iPhone = AppStore|iPhone + AppStore|iPhoneSimulator = AppStore|iPhoneSimulator + AppStore|x64 = AppStore|x64 + AppStore|x86 = AppStore|x86 + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|iPhone = Debug|iPhone + Debug|iPhoneSimulator = Debug|iPhoneSimulator + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|iPhone = Release|iPhone + Release|iPhoneSimulator = Release|iPhoneSimulator + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|ARM.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|ARM64.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|ARM64.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|ARM64.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|x64.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|Any CPU.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|Any CPU.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|ARM.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|ARM.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|ARM.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|ARM64.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|ARM64.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|ARM64.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|iPhone.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|iPhone.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|x64.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|x64.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|x64.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|x86.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|x86.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.AppStore|x86.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|ARM.ActiveCfg = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|ARM.Build.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|ARM.Deploy.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|ARM64.Build.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|ARM64.Deploy.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|iPhone.Build.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|iPhone.Deploy.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|x64.ActiveCfg = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|x64.Build.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|x64.Deploy.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|x86.ActiveCfg = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|x86.Build.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Debug|x86.Deploy.0 = Debug|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|Any CPU.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|Any CPU.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|ARM.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|ARM.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|ARM.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|ARM64.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|ARM64.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|ARM64.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|iPhone.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|iPhone.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|iPhone.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|x64.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|x64.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|x64.Deploy.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|x86.ActiveCfg = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|x86.Build.0 = Release|Any CPU + {17579977-DC58-416C-B1C3-AAAECEEBB41D}.Release|x86.Deploy.0 = Release|Any CPU + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Ad-Hoc|ARM64.ActiveCfg = Ad-Hoc|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.AppStore|ARM.ActiveCfg = AppStore|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.AppStore|ARM64.ActiveCfg = AppStore|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.AppStore|iPhone.ActiveCfg = AppStore|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.AppStore|iPhone.Build.0 = AppStore|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.AppStore|x64.ActiveCfg = AppStore|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.AppStore|x86.ActiveCfg = AppStore|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Debug|Any CPU.ActiveCfg = Debug|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Debug|ARM.ActiveCfg = Debug|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Debug|ARM64.ActiveCfg = Debug|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Debug|iPhone.ActiveCfg = Debug|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Debug|iPhone.Build.0 = Debug|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Debug|x64.ActiveCfg = Debug|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Debug|x86.ActiveCfg = Debug|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Release|Any CPU.ActiveCfg = Release|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Release|ARM.ActiveCfg = Release|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Release|ARM64.ActiveCfg = Release|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Release|iPhone.ActiveCfg = Release|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Release|iPhone.Build.0 = Release|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Release|x64.ActiveCfg = Release|iPhone + {F1606259-0C33-4086-A4A7-F95C73ED46AF}.Release|x86.ActiveCfg = Release|iPhone + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|Any CPU.ActiveCfg = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|Any CPU.Build.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|Any CPU.Deploy.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|ARM.ActiveCfg = Release|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|ARM.Build.0 = Release|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|ARM.Deploy.0 = Release|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|ARM64.ActiveCfg = Release|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|ARM64.Build.0 = Release|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|ARM64.Deploy.0 = Release|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|iPhone.ActiveCfg = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|iPhone.Build.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|iPhone.Deploy.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|x64.ActiveCfg = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|x64.Build.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|x64.Deploy.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|x86.ActiveCfg = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|x86.Build.0 = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Ad-Hoc|x86.Deploy.0 = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|Any CPU.ActiveCfg = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|Any CPU.Build.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|Any CPU.Deploy.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|ARM.ActiveCfg = Release|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|ARM.Build.0 = Release|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|ARM.Deploy.0 = Release|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|ARM64.ActiveCfg = Release|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|ARM64.Build.0 = Release|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|ARM64.Deploy.0 = Release|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|iPhone.ActiveCfg = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|iPhone.Build.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|iPhone.Deploy.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|iPhoneSimulator.ActiveCfg = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|iPhoneSimulator.Build.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|iPhoneSimulator.Deploy.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|x64.ActiveCfg = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|x64.Build.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|x64.Deploy.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|x86.ActiveCfg = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|x86.Build.0 = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.AppStore|x86.Deploy.0 = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|Any CPU.ActiveCfg = Debug|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|ARM.ActiveCfg = Debug|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|ARM.Build.0 = Debug|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|ARM.Deploy.0 = Debug|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|ARM64.Build.0 = Debug|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|iPhone.ActiveCfg = Debug|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|x64.ActiveCfg = Debug|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|x64.Build.0 = Debug|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|x64.Deploy.0 = Debug|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|x86.ActiveCfg = Debug|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|x86.Build.0 = Debug|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Debug|x86.Deploy.0 = Debug|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|Any CPU.ActiveCfg = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|ARM.ActiveCfg = Release|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|ARM.Build.0 = Release|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|ARM.Deploy.0 = Release|ARM + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|ARM64.ActiveCfg = Release|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|ARM64.Build.0 = Release|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|ARM64.Deploy.0 = Release|ARM64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|iPhone.ActiveCfg = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|iPhoneSimulator.ActiveCfg = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|x64.ActiveCfg = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|x64.Build.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|x64.Deploy.0 = Release|x64 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|x86.ActiveCfg = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|x86.Build.0 = Release|x86 + {455221B3-484E-412B-ADB1-D884CCA47383}.Release|x86.Deploy.0 = Release|x86 + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|ARM64.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|ARM64.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|ARM.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|ARM64.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|ARM64.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|iPhone.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|x64.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|x64.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|x86.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.AppStore|x86.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|ARM.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|ARM.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|ARM64.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|iPhone.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|x64.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|x64.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|x86.ActiveCfg = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Debug|x86.Build.0 = Debug|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|Any CPU.Build.0 = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|ARM.ActiveCfg = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|ARM.Build.0 = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|ARM64.ActiveCfg = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|ARM64.Build.0 = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|iPhone.ActiveCfg = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|iPhone.Build.0 = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|x64.ActiveCfg = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|x64.Build.0 = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|x86.ActiveCfg = Release|Any CPU + {79389D18-22EF-4C88-B0E1-177FCC8400FD}.Release|x86.Build.0 = Release|Any CPU + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|Any CPU.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|Any CPU.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|ARM.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|ARM.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|ARM64.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|ARM64.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|iPhone.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|iPhone.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|x64.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|x64.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|x86.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Ad-Hoc|x86.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|Any CPU.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|Any CPU.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|ARM.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|ARM.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|ARM64.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|ARM64.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|iPhone.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|iPhone.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|x64.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|x64.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|x86.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.AppStore|x86.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Debug|ARM.ActiveCfg = Debug|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Debug|ARM64.ActiveCfg = Debug|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Debug|iPhone.ActiveCfg = Debug|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Debug|x64.ActiveCfg = Debug|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Debug|x86.ActiveCfg = Debug|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Release|ARM.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Release|ARM64.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Release|iPhone.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Release|x64.ActiveCfg = Release|iPhoneSimulator + {60704335-4B3D-47D9-8684-BBEE1AC8EE88}.Release|x86.ActiveCfg = Release|iPhoneSimulator + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|ARM64.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|ARM64.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|ARM.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|ARM64.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|ARM64.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|iPhone.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|x64.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|x64.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|x86.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.AppStore|x86.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|ARM.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|ARM.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|ARM64.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|iPhone.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|x64.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|x64.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|x86.ActiveCfg = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Debug|x86.Build.0 = Debug|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|Any CPU.Build.0 = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|ARM.ActiveCfg = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|ARM.Build.0 = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|ARM64.ActiveCfg = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|ARM64.Build.0 = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|iPhone.ActiveCfg = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|iPhone.Build.0 = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|x64.ActiveCfg = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|x64.Build.0 = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|x86.ActiveCfg = Release|Any CPU + {98CCBE56-376A-409D-93E6-6424337333A7}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B8683C54-9538-47DD-B824-53DA7518535A} + EndGlobalSection +EndGlobal diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Assets/AboutAssets.txt b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Assets/AboutAssets.txt new file mode 100644 index 0000000..ee39886 --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Assets/AboutAssets.txt @@ -0,0 +1,19 @@ +Any raw assets you want to be deployed with your application can be placed in +this directory (and child directories) and given a Build Action of "AndroidAsset". + +These files will be deployed with you package and will be accessible using Android's +AssetManager, like this: + +public class ReadAsset : Activity +{ + protected override void OnCreate (Bundle bundle) + { + base.OnCreate (bundle); + + InputStream input = Assets.Open ("my_asset.txt"); + } +} + +Additionally, some Android functions will automatically load asset files: + +Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); \ No newline at end of file diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Assets/Fonts/winjs-symbols.ttf b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Assets/Fonts/winjs-symbols.ttf new file mode 100644 index 0000000000000000000000000000000000000000..118f5c48501c5e6f15f561fb4521a5b285ad8f7c GIT binary patch literal 53776 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 XBP2h2|1TVD_s@^~ new App(), javaReference, transfer) + { + ConfigureUniversalImageLoader(); + } + + private void ConfigureUniversalImageLoader() + { + // Create global configuration and initialize ImageLoader with this config + ImageLoaderConfiguration config = new ImageLoaderConfiguration + .Builder(Context) + .Build(); + + ImageLoader.Instance.Init(config); + + ImageSource.DefaultImageLoader = ImageLoader.Instance.LoadImageAsync; + } + } +} diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/MainActivity.cs b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/MainActivity.cs new file mode 100644 index 0000000..d76b307 --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/MainActivity.cs @@ -0,0 +1,18 @@ +using Android.App; +using Android.Widget; +using Android.OS; +using Android.Content.PM; +using Android.Views; + +namespace MvvmSample.Droid +{ + [Activity( + MainLauncher = true, + ConfigurationChanges = Uno.UI.ActivityHelper.AllConfigChanges, + WindowSoftInputMode = SoftInput.AdjustPan | SoftInput.StateHidden + )] + public class MainActivity : Windows.UI.Xaml.ApplicationActivity + { + } +} + diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/MvvmSample.Droid.csproj b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/MvvmSample.Droid.csproj new file mode 100644 index 0000000..d0aee46 --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/MvvmSample.Droid.csproj @@ -0,0 +1,105 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {17579977-DC58-416C-B1C3-AAAECEEBB41D} + {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + MvvmSample.Droid + MvvmSample.Droid + 512 + true + Resources\Resource.Designer.cs + + false + Off + False + v9.0 + Properties\AndroidManifest.xml + True + ..\MvvmSample.Shared\Strings + + + true + portable + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + True + None + + + portable + true + true + true + bin\Release\ + TRACE + prompt + 4 + False + SdkOnly + true + true + true + true + true + + + + + + + + + + + + + 7.0.0-build.152 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {98ccbe56-376a-409d-93e6-6424337333a7} + MvvmSample.Core + + + + + + + \ No newline at end of file diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Properties/AndroidManifest.xml b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Properties/AndroidManifest.xml new file mode 100644 index 0000000..c0a5b95 --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Properties/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Properties/AssemblyInfo.cs b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..bedf68a --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Properties/AssemblyInfo.cs @@ -0,0 +1,30 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Android.App; + +// 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("MvvmSample.Droid")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MvvmSample.Droid")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] + +// 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")] diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/AboutResources.txt b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/AboutResources.txt new file mode 100644 index 0000000..c2bca97 --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/AboutResources.txt @@ -0,0 +1,44 @@ +Images, layout descriptions, binary blobs and string dictionaries can be included +in your application as resource files. Various Android APIs are designed to +operate on the resource IDs instead of dealing with images, strings or binary blobs +directly. + +For example, a sample Android app that contains a user interface layout (main.axml), +an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) +would keep its resources in the "Resources" directory of the application: + +Resources/ + drawable/ + icon.png + + layout/ + main.axml + + values/ + strings.xml + +In order to get the build system to recognize Android resources, set the build action to +"AndroidResource". The native Android APIs do not operate directly with filenames, but +instead operate on resource IDs. When you compile an Android application that uses resources, +the build system will package the resources for distribution and generate a class called "R" +(this is an Android convention) that contains the tokens for each one of the resources +included. For example, for the above Resources layout, this is what the R class would expose: + +public class R { + public class drawable { + public const int icon = 0x123; + } + + public class layout { + public const int main = 0x456; + } + + public class strings { + public const int first_string = 0xabc; + public const int second_string = 0xbcd; + } +} + +You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main +to reference the layout/main.axml file, or R.strings.first_string to reference the first +string in the dictionary file values/strings.xml. \ No newline at end of file diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/drawable/Icon.png b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/drawable/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/values/Strings.xml b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/values/Strings.xml new file mode 100644 index 0000000..00af15c --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/values/Strings.xml @@ -0,0 +1,5 @@ + + + Hello World, Click Me! + MvvmSample + diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/values/Styles.xml b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/values/Styles.xml new file mode 100644 index 0000000..d668a8e --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Droid/Resources/values/Styles.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/App.xaml b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/App.xaml new file mode 100644 index 0000000..f7355a4 --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/App.xaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/App.xaml.cs b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/App.xaml.cs new file mode 100644 index 0000000..aef6a2f --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/App.xaml.cs @@ -0,0 +1,183 @@ +using Microsoft.Extensions.Logging; +using MvvmSampleUwp; +using MvvmSampleUwp.Helpers; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.ApplicationModel.Core; +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 MvvmSample +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + sealed partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + ConfigureFilters(global::Uno.Extensions.LogExtensionPoint.AmbientLoggerFactory); + + this.InitializeComponent(); + this.Suspending += OnSuspending; + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(LaunchActivatedEventArgs e) + { +#if DEBUG + if (System.Diagnostics.Debugger.IsAttached) + { + // this.DebugSettings.EnableFrameRateCounter = true; + } +#endif + //Frame rootFrame = Windows.UI.Xaml.Window.Current.Content as Frame; + + //// Do not repeat app initialization when the Window already has content, + //// just ensure that the window is active + //if (rootFrame == null) + //{ + // // Create a Frame to act as the navigation context and navigate to the first page + // rootFrame = new Frame(); + + // rootFrame.NavigationFailed += OnNavigationFailed; + + // if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) + // { + // //TODO: Load state from previously suspended application + // } + + // // Place the frame in the current Window + // Windows.UI.Xaml.Window.Current.Content = rootFrame; + //} + + //if (e.PrelaunchActivated == false) + //{ + // if (rootFrame.Content == null) + // { + // // When the navigation stack isn't restored navigate to the first page, + // // configuring the new page by passing required information as a navigation + // // parameter + // rootFrame.Navigate(typeof(MainPage), e.Arguments); + // } + // // Ensure the current window is active + // Windows.UI.Xaml.Window.Current.Activate(); + //} + + // Ensure the UI is initialized + if (Window.Current.Content is null) + { + Window.Current.Content = new Shell(); + + TitleBarHelper.StyleTitleBar(); + TitleBarHelper.ExpandViewIntoTitleBar(); + } + + // Enable the prelaunch if needed, and activate the window + if (e.PrelaunchActivated == false) + { + CoreApplication.EnablePrelaunch(true); + + Window.Current.Activate(); + } + } + + /// + /// Invoked when Navigation to a certain page fails + /// + /// The Frame which failed navigation + /// Details about the navigation failure + void OnNavigationFailed(object sender, NavigationFailedEventArgs e) + { + throw new Exception($"Failed to load {e.SourcePageType.FullName}: {e.Exception}"); + } + + /// + /// Invoked when application execution is being suspended. Application state is saved + /// without knowing whether the application will be terminated or resumed with the contents + /// of memory still intact. + /// + /// The source of the suspend request. + /// Details about the suspend request. + private void OnSuspending(object sender, SuspendingEventArgs e) + { + var deferral = e.SuspendingOperation.GetDeferral(); + //TODO: Save application state and stop any background activity + deferral.Complete(); + } + + + /// + /// Configures global logging + /// + /// + static void ConfigureFilters(ILoggerFactory factory) + { + factory + .WithFilter(new FilterLoggerSettings + { + { "Uno", LogLevel.Warning }, + { "Windows", LogLevel.Warning }, + + // Debug JS interop + // { "Uno.Foundation.WebAssemblyRuntime", LogLevel.Debug }, + + // Generic Xaml events + // { "Windows.UI.Xaml", LogLevel.Debug }, + // { "Windows.UI.Xaml.VisualStateGroup", LogLevel.Debug }, + // { "Windows.UI.Xaml.StateTriggerBase", LogLevel.Debug }, + // { "Windows.UI.Xaml.UIElement", LogLevel.Debug }, + + // Layouter specific messages + // { "Windows.UI.Xaml.Controls", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.Layouter", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.Panel", LogLevel.Debug }, + // { "Windows.Storage", LogLevel.Debug }, + + // Binding related messages + // { "Windows.UI.Xaml.Data", LogLevel.Debug }, + + // DependencyObject memory references tracking + // { "ReferenceHolder", LogLevel.Debug }, + + // ListView-related messages + // { "Windows.UI.Xaml.Controls.ListViewBase", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.ListView", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.GridView", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.VirtualizingPanelLayout", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.NativeListViewBase", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.ListViewBaseSource", LogLevel.Debug }, //iOS + // { "Windows.UI.Xaml.Controls.ListViewBaseInternalContainer", LogLevel.Debug }, //iOS + // { "Windows.UI.Xaml.Controls.NativeListViewBaseAdapter", LogLevel.Debug }, //Android + // { "Windows.UI.Xaml.Controls.BufferViewCache", LogLevel.Debug }, //Android + // { "Windows.UI.Xaml.Controls.VirtualizingPanelGenerator", LogLevel.Debug }, //WASM + } + ) +#if DEBUG + .AddConsole(LogLevel.Debug); +#else + .AddConsole(LogLevel.Information); +#endif + } + } +} diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/LockScreenLogo.scale-200.png b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..735f57adb5dfc01886d137b4e493d7e97cf13af3 GIT binary patch literal 1430 zcmaJ>TTC2P7~aKltDttVHYH6u8Io4i*}3fO&d$gd*bA_<3j~&e7%8(eXJLfhS!M@! zKrliY>>6yT4+Kr95$!DoD(Qn-5TP|{V_KS`k~E6(LGS@#`v$hQo&^^BKsw3HIsZBT z_y6C2n`lK@apunKojRQ^(_P}Mgewt$(^BBKCTZ;*xa?J3wQ7~@S0lUvbcLeq1Bg4o zH-bvQi|wt~L7q$~a-gDFP!{&TQfc3fX*6=uHv* zT&1&U(-)L%Xp^djI2?~eBF2cxC@YOP$+9d?P&h?lPy-9M2UT9fg5jKm1t$m#iWE{M zIf%q9@;fyT?0UP>tcw-bLkz;s2LlKl2qeP0w zECS7Ate+Awk|KQ+DOk;fl}Xsy4o^CY=pwq%QAAKKl628_yNPsK>?A>%D8fQG6IgdJ ztnxttBz#NI_a@fk7SU`WtrpsfZsNs9^0(2a z@C3#YO3>k~w7?2hipBf{#b6`}Xw1hlG$yi?;1dDs7k~xDAw@jiI*+tc;t2Lflg&bM)0!Y;0_@=w%`LW^8DsYpS#-bLOklX9r?Ei}TScw|4DbpW%+7 zFgAI)f51s}{y-eWb|vrU-Ya!GuYKP)J7z#*V_k^Xo>4!1Yqj*m)x&0L^tg3GJbVAJ zJ-Pl$R=NAabouV=^z_t;^K*0AvFs!vYU>_<|I^#c?>>CR<(T?=%{;U=aI*SbZADLH z&(f2wz_Y0??Tf|g;?|1Znw6}6U43Q#qNRwv1vp9uFn1)V#*4p&%$mP9x&15^OaBiDS(XppT|z^>;B{PLVEbS3IFYV yGvCsSX*m literal 0 HcmV?d00001 diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/SharedAssets.md b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/SharedAssets.md new file mode 100644 index 0000000..8d2d37a --- /dev/null +++ b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/SharedAssets.md @@ -0,0 +1,34 @@ +See documentation about assets here : https://github.com/unoplatform/uno/blob/master/doc/articles/features/working-with-assets.md + +# Here is a cheat sheet: + +1. Add the image file to the `Assets` directory of a shared project. +2. Set the build action to `Content`. +3. (Recommended) Provide an asset for various scales/dpi + +## Examples + +``` +\Assets\Images\logo.scale-100.png +\Assets\Images\logo.scale-200.png +\Assets\Images\logo.scale-400.png + +\Assets\Images\scale-100\logo.png +\Assets\Images\scale-200\logo.png +\Assets\Images\scale\400\logo.png +``` + +## Table of scales + +| Scale | UWP | iOS | Android | +|-------|:-----------:|:--------:|:-------:| +| `100` | scale-100 | @1x | mdpi | +| `125` | scale-125 | N/A | N/A | +| `150` | scale-150 | N/A | hdpi | +| `200` | scale-200 | @2x | xhdpi | +| `300` | scale-300 | @3x | xxhdpi | +| `400` | scale-400 | N/A | xxxhdpi | + + + + diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/SplashScreen.scale-200.png b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/SplashScreen.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..023e7f1feda78d5100569825acedfd213a0d84e9 GIT binary patch literal 7700 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 literal 0 HcmV?d00001 diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Square150x150Logo.scale-200.png b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..af49fec1a5484db1d52a7f9b5ec90a27c7030186 GIT binary patch literal 2937 zcma)84OCO-8BSud5)jwMLRVKgX(S?$n?Ld|vrsm<$CF7)&zTbyy1FE5bU`Q17MRv`9ue$;R(@8kR;#vJ*IM0>cJIAOte!d7oRgdH zd%ySjdB6L9=gX^A6)VzH7p2l@v~3zJAMw|DFy#^)F@@F*`mqUn=Il>l)8_+ab;nOW{%+iPx z+s{Eu|&pIs)Z7{La9~?xKfyl z#43?gjEL15d4WbOZo#SiP%>DB^+BcnJ=7dHEe;r#G=tuw|ka z%q@}##Uh7;tc%L_64m(kHtw74ty%BJMb)_1)#S0j`)F8_1jF7vScpsnH=0V19bO8y zR`0SjIdCUo&=>JwMQF8KHA<{ODHTiQh}0^@5QRmCA?gOH6_H3K^-_sNB^RrdNuK-R zOO*vOrKCVvDwgUck`kF(E7j{I#iiN;b*ZdCt4m@HPA`EuEqGGf4%!K<;(=I=&Vyrw z%TwcWtxa}8mCZ%Cyf&ActJ6_$ox5z6-D!0-dvnRx6t7y3d+h6QYpKWO;8OdnvERo7 zuEf>ih5`wqY)~o@OeVt-wM?Q!>QzdGRj!bz6fzYrfw$hZfAKzr2-M+D+R>}~oT574c;_3zquHcElqKIsryILt3g8n3jcMb+j?i?-L3FpZJ z2WRVBRdDPc+G5aaYg#5hpE+6nQ|(VSoxT3|biF;BUq#==-27Xi=gihDPYP$7?=9cP zYKE$jeQ|3~_L0VG-(F~2ZPyD0=k{J4Q~h(t__{-mz_w8{JDY9{`1ouzz!Vr5!ECdE z6U~O1k8c}24V7~zzXWTV-Pe4)y}wQJS&q%H5`Fo_f_JvIU489aCX$;P`u#!I-=^4ijC2{&9!O&h>mi?9oYD=GC#%)6{GzN6nQYw+Fal50!#x^asjBBR50i`+mho*ttoqV)ubM2KD9S~k7+FR4>{29?6 z{!l6kDdyTN0YJ9LgkPWeXm|gyi@zM3?0@{&pXT12w|78&W-q!RRF)&iLCEZVH<|fR zN0fr2^t8H(>L?>K#>^+jWROLral(Qy-xoBq1U7A&DV||wClb)Otd9?(gZ|8znMF}D zf<1haWz^s0qgecz;RFGt0C-B4g`jNGHsFU+;{<%t65v^sjk^h$lmWn#B0#_)9ij&d z-~lc`A)YYExi^7sBuPM^Y|wA2g*5?`K?#7tzELQYNxGo$UB$4J8RJp1k(8Jj+~hMT zlN~>M@KTTh^--8y3PK_NZ@AC!{PT=CziBzGd+wTJ^@icH!Bd}%)g8V)%K?|c&WTUk zy}qv1C%(fjRoZ4ozC3{O%@5?)XzH35zHns$pgU*Q?fj4v?fp1Qbm+j;3l;9jam9Da zXVcKjPlQ73x78QPu|Ffm6x?`~e3oD=gl=4kYK?={kD5j~QCXU)`HSdduNNENzA*2$ zOm3PzF!lN5e*06-f1Uot67wY#{o-S1!KZ7E=!~7ynnk9_iJR#kFoNbAOT#^2Gd17F zMmvU6>lndZQGd|ax9kUoXXO+$N?|j@6qpsF&_j7YXvwo_C{JpmLw5&#e6k>atv%es z5)7r*Wvv_JkUpT}M!_o!nVlEk1Zbl=a*2hQ*<|%*K1Glj^FcF`6kTzGQ3lz~2tCc@ z&x|tj;aH&1&9HwcJBcT`;{?a+pnej;M1HO(6Z{#J!cZA04hnFl;NXA+&`=7bjW_^o zfC40u3LMG?NdPtwGl>Tq6u}*QG)}-y;)lu-_>ee3kibW(69n0$0Zy!}9rQz%*v1iO zT9_H>99yIrSPYVy6^);rR}7Yo=J_T@hi+qhTZXnVWyf;JDYm5#eYLTxr*?kiNn!+Y zQ+LUkBafNJ#rH#C(?d5^;gw9o#%daEI{mA*LHPIHPU`#|H$hD zwm>0&+kahQ)E#%~k>&5@&#Vg82H?s%71=)(soi@174pi9--2{w{1$}Sz4zGn3Du&x bht0Iza^2ykEt4(epJ78uh5nDlX8(TxzDYwP literal 0 HcmV?d00001 diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Square44x44Logo.scale-200.png b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..ce342a2ec8a61291ba76c54604aea7e9d20af11b GIT binary patch literal 1647 zcmaJ?eM}Q)7(e+G1Q(|`V9JhTI2>MkceK4;p;PR&$Pi?ejk3YQ_3o`S&|W_dsOZ8# zWPTt69g`t$ab`0cj-Y0yiBSOqmd)tG7G(}M5aP0_%&9TijB#&)I{zSE^4@#z^FF`l z`8{8`o%wlL(UI|y2!cdsuVamHH~H86F!*-15em4)NqUpCQM5?aoC_eCf@lV4wvF2a zjDQn1JBL69f&@2M3rvzJcfE!eZ8FZUBlFlC5RD)it33{mF9#B82AiyQE%w)`vlwa> zv{<1sm&kSKK$&%2jSFn7$t&P%%6Ue>R=EAnG8N7fqynWG8L3p!4801a;8{+nliO(qd(jNJ_?+9W3#hLIDLoT6~3fx9=`CC-D}-AMrpEO7HK zt3$GicGPc?GmDjy7K2P@La;eu4!$zWCZ`ym{Z$b zu-O6RM&K4JT|BIZB`E-gxqG%FzanI#+2FFmqHqXG7yxWB=w55RGOM)$xMb(>kSNR z2w=1AZi%z=AmG~yea~XaXJR!v7vLn(RUnELfiB1|6D84ICOS}^Zo2AdN}<&*h}G_u z{xZ!(%>tLT3J3<5XhWy-tg+6)0nmUUENLW8TWA{R6bgVd3X;anYFZ^IRis*_P-C-r z;i>%1^eL3UI2-{w8nuFFcs0e~7J{O2k^~Ce%+Ly4U?|=!0LH=t6()xi<^I-rs+9sF z*q{E-CxZbGPeu#a;XJwE;9S1?#R&uns>^0G3p`hEUF*v`M?@h%T%J%RChmD|EVydq zmHWh*_=S%emRC*mhxaVLzT@>Z2SX0u9v*DIJ@WC^kLVdlGV6LpK$KIrlJqc zpJ921)+3JJdTx|<`G&kXpKkjGJv=76R`yYIQ{#c-`%+`#V(7}Q;&@6U8!Td1`d;?N z_9mnI#?AA}4J!r)LN4!E-@H5eXauuB7TOawS>Y|{-P?NNx-lq+z1W-+y(;39P&&LP zL{N80?&=C*qKmdA^moMZRuPcD!B<*mq$ch=0Cnlitw#txRWhb3%TQvPqjkC`F69G4b! ze7z9MZ#+;_#l?H37UqUhDFb^l&s2{oM$3I0o^Q!yx;;V)QmCMo)Tb_ui|mit8MS?U zm##6$sZZ1$@|s%?l@>4Z<*Q}sRBSKMhb4I{e5LdEhsHIHTe8Bod5c>6QtT>$XgUBz z6MK`kO$=jmt@FqggOhJ5j~e@ygRbG;<{Vu)*+nn9aQeo0;$#j;|MS=S$&L?BeV25z xs3B`@=#`5TF{^6(A1rvdY@|-RtQ|iS5{tyX+wH?;n8E)G$kykv-D^wh{{!TZT%7;_ literal 0 HcmV?d00001 diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c02ce97e0a802b85f6021e822c89f8bf57d5cd GIT binary patch literal 1255 zcmaJ>TWs4@7*5+{G#S+&C!qC#> zf>5N3P6jO*Cz>ug*(_DmW=)kea&m$gZ^+nyiF`;j%w@}y8)>p*SH}C`m?DXeieF2U zyQHecc_L%Gh!7GMt+hG06y;+|p4>m~}PjA}rKViGiEnn7G0ZO<>G|7q;2?NwGCM3s?eued6%hd$B+ z*kQJ{#~$S=DFE(%=E+UkmlEI*%3llUf~8Ja9YU1Vui0IbGBkW_gHB%Rd&!!ioX zs40O?i9I{};kle7GMvE7(rk`la=gTI)47=>%?q@^iL-nUo3}h4S}N-KHn8t5mVP8w z&bSErwp+37 zNJJ8?a|{r5Q3R0Z5s-LB1WHOwYC@7pCHWND#cL1cZ?{kJ368_*(UDWUDyb<}0y@o# zfMF016iMWPCb6obAxT$JlB6(2DrlXDTB&!0`!m??4F(qWMhjVZo?JXQmz`1*58Z=& zcDmB|S-E@j?BoFGix0flckqdS4jsPNzhfWyWIM98GxcLs89C(~dw%$_t;JjX-SD}E zfiGV;{8Q%8r}w9x>EEigW81>`kvnU@pK)4+xk9@+bNj9L!AAZ@SZ@q|)&BmY3+HZx zul~BeG4|}-;L%cHViQGQX?^zFfO0&#cHwel=d`lH9sJ-@Sl@n*(8J2>%Ac`IxyY?Q z{=GhWvC#gu-~Ia7*n{=+;qM?Ul_wy1+u7ho;=`>EwP^g~R@{unBds`!#@}tluZQpS zm)M~nYEifJWJGx?_6DcTy>#uh%>!H9=hb^(v`=m3F1{L>db=<5_tm+_&knAQ2EU$s Mu9UqpbNZeC0BbUo^Z)<= literal 0 HcmV?d00001 diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/StoreLogo.png b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..7385b56c0e4d3c6b0efe3324aa1194157d837826 GIT binary patch literal 1451 zcmaJ>eN5D57_Z|bH;{0+1#mbl)eTU3{h)Wf7EZV?;HD@XL@{B`Ui%(2aMxQ~xdXSv z5nzWi(LW)U2=Vc-cY@s7nPt{i0hc6!7xN4NNHI#EQl>YNBy8l4%x9gr_W-j zEZMQmmTIy(>;lblRfh`dIyTgc9W5d!VP$L4(kKrN1c5G~(O_#xG zAJCNTstD^5SeXFB+&$h=ToJP2H>xr$iqPs-#O*;4(!Fjw25-!gEb*)mU}=)J;Iu>w zxK(5XoD0wrPSKQ~rbL^Cw6O_03*l*}i=ydbu7adJ6y;%@tjFeXIXT+ms30pmbOP%Q zX}S;+LBh8Tea~TSkHzvX6$rYb)+n&{kSbIqh|c7hmlxmwSiq5iVhU#iEQ<>a18|O^Sln-8t&+t`*{qBWo5M?wFM(JuimAOb5!K#D}XbslM@#1ZVz_;!9U zpfEpLAOz=0g@bd6Xj_ILi-x^!M}73h^o@}hM$1jflTs|Yuj9AL@A3<-?MV4!^4q`e z)fO@A;{9K^?W?DbnesnPr6kK>$zaKo&;FhFd(GYFCIU^T+OIMb%Tqo+P%oq(IdX7S zf6+HLO?7o0m+p>~Tp5UrXWh!UH!wZ5kv!E`_w)PTpI(#Iw{AS`gH4^b(bm^ZCq^FZ zY9DD7bH}rq9mg88+KgA$Zp!iWncuU2n1AuIa@=sWvUR-s`Qb{R*kk(SPU^`$6BXz8 zn#7yaFOIK%qGxyi`dYtm#&qqox0$h=pNi#u=M8zUG@bpiZ=3sT=1}Trr}39cC)H|v zbL?W)=&s4zrh)7>L(|cc%$1#!zfL?HjpeP%T+x_a+jZ16b^iKOHxFEX$7d|8${H-* zIrOJ5w&i$>*D>AKaIoYg`;{L@jM((Kt?$N$5OnuPqVvq**Nm}(f0wwOF%iX_Pba;V z;m@wxX&NcV3?<1+u?A{y_DIj7#m3Af1rCE)o`D&Y3}0%7E;iX1yMDiS)sh0wKi!36 zL!Wmq?P^Ku&rK~HJd97KkLTRl>ScGFYZNlYytWnhmuu|)L&ND8_PmkayQb{HOY640 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x literal 0 HcmV?d00001 diff --git a/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Wide310x150Logo.scale-200.png b/samples/MvvmSample/MvvmSample/MvvmSample.Shared/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..288995b397fdbef1fb7e85afd71445d5de1952c5 GIT binary patch literal 3204 zcmbVPeQXow8NYmBd90>}0NP?GhXW~VaeThm=a0tV#EwJMI!)6M3}|c4_Bl3=Kd>G0 z(GHx1wl<7(tP?FsOQkTilSo*iIvF%uArExJ73~P zSv1xEy!U(Wd4A9D`FQV@W3@F^qJ@PEF$@z`Z!*BbFsS(^?B zyiAzJ+q})bkgiQHWqEb*jJD-coHYr1^iocg)l!Qa{Xqs-l~6J}p-|##ZHYofskQ3$ zI0;xzXyhazBeXhIsg5A=%ufo@f)1yy&ScKS0;HF^!r_2UE^lpZEom(+@duma3awTv zCrCL-%D_SvYWIcdHkmI}#50(fkUi)Qgx!80ju>g1za^}ff>JI8Z@^-iCiaCgg@TgF z+vtE?Q9{VQUX&MW9SYYmGcxA14%N2@7FwBTD4N<(2{nWgV8$e3?-F=L^&FrtWn~(U_Q~~^uYiyeY6-KoTnfh9AWz@ zIKje0)u!_Lw)E}G!#kEfwKVdNt(UAf9*f>tEL_(=xco-T%jTi@7YlC3hs2ik%Le0H ztj}RTeCF(5mwvi3_56>-yB?l;J>-1%!9~=fs|QcNG3J~a@JCu`4SB460s0ZO+##4fFUSGLcj_ja^fL4&BKALfb#$6$O?>P@qx2Agl^x0i&ugt zsy5Pyu=()`7HRMG3IB7F1@`_ z+-!J%#i6e^U$e#+C%Q>_qVRzWRsG^W_n+@OcX@vzI&z;mzHNb!GQ?LWA(wtpqHqTM z1OFw_{Zn?fD)p)`c`kOgv{de=v@suGRqY{N^U7gI1VF3*F=obwaXI6ob5__Yn zVTguS!%(NI09J8x#AO_aW!9W7k*UvB;IWDFC3srwftr{kHj%g)fvnAm;&h_dnl~

MY- zf+K}sCe8qU6Ujs`3ua{U0Of$R_gVQBuUA za0v=mu#vIOqiiAZOr&h*$WyOw&k-xr$;G4Ixa!#TJNr>95(h>l%)PUy4p+^SgR(uR zta%k*?ny-+nAr8spEk1fo{J4i!b^Fia`N{_F6@zidA2ZTTrjl#^5Z-2KfB@Cu}l9s z(*|Z2jc?p~vn2f)3y9i*7zJV1L{$?|&q)4oaT;uXi6>1GkRXVTOzAz(RHEmr=eFIi z`}<>-Q?K0GN8!IYxeP1XKXO+jsJbp~o^);Bc;%b7Flpe7;1`Ny@3r7ZR;?R)aJt8C ziNlEC<@3f_lIV4TwV}&e;D!Ee5_|e#g0LUh=5vmYWYm7&2h*M>QPKvGh9-)wfMMW3 z8J9b%1k7dzPzO0_NGQy92BZ^FR6R~6;^6?lqO;-QUP4BY%cG%3vEhbm#>4vIhPBh3 z-+pZGjh$x%Hp{?=FHsMp0&wNPlj00us{&`1ZOZTqs8%4X&xH=UDr*xyBW(Zp&Em94 zf)ZSfn#yg0N)>!1kWdkqJ^S*z0FF5|fj&qcE#Na|%OY0$uO>!&hP+1ywfD_WXk@4J(?MBftK7>$Nvqh@tDuarN%PrTLQ2Uzysx>UV=V zk^RrDSvdQ?0;=hY67EgII-f4`t=+i*yS=Y~!XlqIy_4x&%+OdfbKOFPXS2X5%4R{N z$SQMX^AK6(fA + +The [AsyncRelayCommand](https://docs.microsoft.com/dotnet/api/microsoft.toolkit.mvvm.input.AsyncRelayCommand) and [AsyncRelayCommand](https://docs.microsoft.com/dotnet/api/microsoft.toolkit.mvvm.input.AsyncRelayCommand-1) are `ICommand` implementations that extend the functionalities offered by `RelayCommand`, with support for asynchronous operations. + +## How they work + +`AsyncRelayCommand` and `AsyncRelayCommand` have the following main features: + +- They extend the functionalities of the non-asynchronous commands included in the library, with support for `Task`-returning delegates. +- They expose an `ExecutionTask` property that can be used to monitor the progress of a pending operation, and an `IsRunning` that can be used to check when an operation completes. This is particularly useful to bind a command to UI elements such as loading indicators. +- They implement the `IAsyncRelayCommand` and `IAsyncRelayCommand` interfaces, which means that viewmodel can easily expose commands using these to reduce the tight coupling between types. For instance, this makes it easier to replace a command with a custom implementation exposing the same public API surface, if needed. + +## Working with asynchronous commands + +Let's imagine a scenario similar to the one described in the `RelayCommand` sample, but a command executing an asynchronous operation: + +```csharp +public class MyViewModel : ObservableObject +{ + public MyViewModel() + { + DownloadTextCommand = new AsyncRelayCommand(DownloadText); + } + + public IAsyncRelayCommand DownloadTextCommand { get; } + + private Task DownloadText() + { + return WebService.LoadMyTextAsync(); + } +} +``` + +With the related UI code: + +```xml + + + + + + + + + + + + + +