diff --git a/Directory.Build.props b/Directory.Build.props
index 13444a0710..d7f4612cc6 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -27,7 +27,8 @@
true
true
true
- true
+ true
+ false
diff --git a/build/ci/templates/dotnet-install-windows.yml b/build/ci/templates/dotnet-install-windows.yml
index 061da646e6..631dc0ebd7 100644
--- a/build/ci/templates/dotnet-install-windows.yml
+++ b/build/ci/templates/dotnet-install-windows.yml
@@ -32,3 +32,8 @@ steps:
errorActionPreference: continue
ignoreLASTEXITCODE: true
retryCountOnTaskFailure: 3
+
+ - powershell: |
+ dotnet workload install maui --source https://api.nuget.org/v3/index.json
+ dotnet workload install android ios maccatalyst tvos macos maui wasm-tools --source https://api.nuget.org/v3/index.json
+ displayName: Maui workloads
diff --git a/doc/Learn/Tutorials/Maui/HowTo-Use3rdPartLibs.md b/doc/Learn/Tutorials/Maui/HowTo-Use3rdPartLibs.md
new file mode 100644
index 0000000000..e9500bae2d
--- /dev/null
+++ b/doc/Learn/Tutorials/Maui/HowTo-Use3rdPartLibs.md
@@ -0,0 +1,92 @@
+---
+uid: Learn.Tutorials.Maui.HowToUse3rdPartLibs
+---
+
+# How-To: Install and use third part libraries on Uno apps with Maui Embedding
+
+When working in an application project, you may need to install a third party library. This guide will show you how to install and use a third party library in your Uno app with Maui Embedding.
+
+For this sample we will use the `CommunityToolkit.Maui` library.
+
+## Step-by-steps
+
+### 1. Installing the NuGet package
+
+On Visual Studio you can use the `Nuget Package Manager` to install the `CommunityToolkit.Maui` package. Install it on your class library project and mobile and Windows project (because this package support those platforms).
+
+To verify if the package is installed you can look on your csproj file and check if the package is there. It should be something like this:
+
+```xml
+
+
+
+```
+
+### 2. Using the library
+
+In order to use the library we need to initialize it, we do that during the app initialization. So go to your `App.cs` file and add the following code:
+
+```csharp
+using using CommunityToolkit.Maui;
+
+protected async override void OnLaunched(LaunchActivatedEventArgs args)
+{
+ var builder = this.CreateBuilder(args)
+ .UseMauiEmbedding(maui =>
+ {
+ maui.UseMauiCommunityToolkit();
+ })
+ // the rest of your configuration
+}
+```
+
+> [!INFO]
+> If you are using other libraries that targets .NET MAUI and requires initialization, you can do it inside the lambda function on `UseMauiEmbedding` call.
+
+Now let's use it on our Page. For that you have to open your XAML page and add the necessary namespaces and the controls you want to use. In this sample we will use the `DrawingView` control.
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+Let's take a moment and review this piece of code. First we added the `toolkit` namespace, this is the namespace that contains the controls from the `CommunityToolkit.Maui` library. In order to consume the `DrawingView` control. We need to use the `MauiContent` control, that lives on `uem` namespace, this control holds all the .NET MAUI types (layouts, controls, converters, etc), you can't use .NET MAUI types outside this control.
+
+Also, Uno Platform does not convert the `Color` type from .NET MAUI to the WinUI `Color`, so we need to use the `MauiColor` markup extension for the conversion, as you can see in the `LineColor` property.
+
+### 3. Conclusion
+
+At this point, running the app should show the `DrawingView` control and allow interactions with it.
\ No newline at end of file
diff --git a/doc/Overview/Maui/MauiOverview.md b/doc/Overview/Maui/MauiOverview.md
new file mode 100644
index 0000000000..d17c9c1195
--- /dev/null
+++ b/doc/Overview/Maui/MauiOverview.md
@@ -0,0 +1,88 @@
+---
+uid: Overview.Maui
+---
+# .NET Maui Embedding
+
+.NET Maui Embedding provides limited support for Uno Applications to make use of 3rd party control libraries when the required app platforms match one of those available from .NET MAUI.
+
+## Initialization
+
+After installing the `Uno.Extensions.Maui.WinUI` NuGet package you will need to update your App.cs in the core/shared project of your Uno Platform Project.
+
+```cs
+protected override void OnLaunched(LaunchActivatedEventArgs args)
+{
+ this.UseMauiEmbedding();
+}
+```
+
+Similarly if you are using Uno.Extensions.Hosting for Dependency Injection you can call the `UseMauiEmbedding()` extension off of the `IApplicationBuilder` like:
+
+```cs
+protected override void OnLaunched(LaunchActivatedEventArgs args)
+{
+ var builder = this.CreateBuilder(args)
+ .UseMauiEmbedding();
+}
+```
+
+In the event that your 3rd party control library requires initialization on the `MauiAppBuilder` you can initialize those libraries by simply providing a delegate for the `MauiAppBuilder` in the `UseMauiEmbedding()` extension method:
+
+```cs
+protected override void OnLaunched(LaunchActivatedEventArgs args)
+{
+ var builder = this.CreateBuilder(args)
+ .UseMauiEmbedding(maui => maui
+ .UseTelerikControls())
+}
+```
+
+## Getting Started
+
+With Maui Initialized we are now able to make use of the MauiContent control provided by Uno.Extensions.Maui.WinUI.
+
+```xml
+
+
+
+
+
+
+```
+
+### Resources & Styles
+
+When the MauiContent is created it will walk the Visual Tree and look for any parents including `Application.Current` which have a ResourceDictionary which has Resources and/or Styles. It will then do it's best to bring these over to the available MAUI Resources. This includes being able to reuse Colors, Brushes, Thickness, and Converters as well as some limited support for Styles.
+
+### XAML Extensions
+
+There are several XAML Extensions that you may decide to make use of while building an app with .NET MAUI Embedding.
+
+- MauiBinding - As the name suggests this will allow you to create a binding to your DataContext. **NOTE** You can not use `x:Bind` or `Binding` on a MAUI Control.
+- MauiColor: If you want to be able to directly apply a Hex string or `Color` name to a `Color` property on a MAUI Control you can use the `MauiColor` Extension to provide that value.
+- MauiThickness: If you want to be able to directly apply a `Thickness`, you can use the `MauiThickness` extension to provide a value like `10`, `10,20`, or `10,20,10,5`
+- MauiResource: As explained in the previous section, the `MauiContent` control will bring over the WinUI Resources automatically to make it easier to provide consistent styling even within the `MauiContent` of your View. This will allow you to provide a resource Key to apply to a given property.
+
+```xml
+
+
+
+```
+
+### Limitations and Known issues
+
+- Some controls like the `ScrollView` from .NET MAUI will not have the `Content` property automatically recognized by the XAML compiler. As a result you will need to be more verbose with these controls like:
+ ```xml
+
+
+
+
+
+ ```
+- Common type conversions such as hex string or color name to Maui Graphics Color will not work with the XAML Compiler. Similarly types like Thickness `10` or `10,20` will not be picked up and converted by the XAML Compiler. For these primitive types especially it is recommended to simply provide a WinUI Thickness or Color in your Resource Dictionary. These native types will be automatically converted to MAUI types and available to use with the `MauiResource` XAML Extension.
+- .NET MAUI Hot Reload will throw an exception and cause the app the crash. You will need to disable this in Visual Studio for now.
diff --git a/samples/MauiEmbedding/.vscode/launch.json b/samples/MauiEmbedding/.vscode/launch.json
new file mode 100644
index 0000000000..84e4fa1a09
--- /dev/null
+++ b/samples/MauiEmbedding/.vscode/launch.json
@@ -0,0 +1,15 @@
+{
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Uno Platform Mobile",
+ "type": "Uno",
+ "request": "launch",
+ // any Uno* task will do, this is simply to satisfy vscode requirement when a launch.json is present
+ "preLaunchTask": "Uno: android | Debug | android-x64"
+ },
+ ]
+}
diff --git a/samples/MauiEmbedding/Directory.Build.props b/samples/MauiEmbedding/Directory.Build.props
new file mode 100644
index 0000000000..6f66a3ed8a
--- /dev/null
+++ b/samples/MauiEmbedding/Directory.Build.props
@@ -0,0 +1,56 @@
+
+
+ enable
+ enable
+
+ portable
+ True
+
+ true
+ NU1009
+ $(NoWarn);CA1416;NU1507;NU1009
+
+ en
+
+ false
+ false
+ false
+ false
+ false
+ <_UseTelerik>false
+
+
+
+
+
+ true
+ 21.0
+
+
+
+
+ true
+ 14.2
+
+
+
+
+ true
+ 10.14
+
+
+
+
+ true
+ 14.0
+
+
+
+
+ true
+ 10.0.18362.0
+ 10.0.18362.0
+
+
+
+
diff --git a/samples/MauiEmbedding/Directory.Build.targets b/samples/MauiEmbedding/Directory.Build.targets
new file mode 100644
index 0000000000..30332cf7d5
--- /dev/null
+++ b/samples/MauiEmbedding/Directory.Build.targets
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/Directory.Packages.props b/samples/MauiEmbedding/Directory.Packages.props
new file mode 100644
index 0000000000..8a4a39df79
--- /dev/null
+++ b/samples/MauiEmbedding/Directory.Packages.props
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding-vsmac.slnf b/samples/MauiEmbedding/MauiEmbedding-vsmac.slnf
new file mode 100644
index 0000000000..042903e074
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding-vsmac.slnf
@@ -0,0 +1,36 @@
+{
+ "solution": {
+ "path": "MauiEmbedding.sln",
+ "projects": [
+ "..\\..\\src\\Uno.Extensions.Configuration\\Uno.Extensions.Configuration.csproj",
+ "..\\..\\src\\Uno.Extensions.Core.Generators\\Uno.Extensions.Core.Generators.csproj",
+ "..\\..\\src\\Uno.Extensions.Core.UI\\Uno.Extensions.Core.WinUI.csproj",
+ "..\\..\\src\\Uno.Extensions.Core\\Uno.Extensions.Core.csproj",
+ "..\\..\\src\\Uno.Extensions.Hosting.UI\\Uno.Extensions.Hosting.WinUI.Skia.csproj",
+ "..\\..\\src\\Uno.Extensions.Hosting.UI\\Uno.Extensions.Hosting.WinUI.Wasm.csproj",
+ "..\\..\\src\\Uno.Extensions.Hosting.UI\\Uno.Extensions.Hosting.WinUI.csproj",
+ "..\\..\\src\\Uno.Extensions.Hosting\\Uno.Extensions.Hosting.csproj",
+ "..\\..\\src\\Uno.Extensions.Localization.UI\\Uno.Extensions.Localization.WinUI.csproj",
+ "..\\..\\src\\Uno.Extensions.Localization\\Uno.Extensions.Localization.csproj",
+ "..\\..\\src\\Uno.Extensions.Logging.Serilog\\Uno.Extensions.Logging.Serilog.csproj",
+ "..\\..\\src\\Uno.Extensions.Logging\\Uno.Extensions.Logging.WinUI.Skia.csproj",
+ "..\\..\\src\\Uno.Extensions.Logging\\Uno.Extensions.Logging.WinUI.Wasm.csproj",
+ "..\\..\\src\\Uno.Extensions.Logging\\Uno.Extensions.Logging.WinUI.csproj",
+ "..\\..\\src\\Uno.Extensions.Maui.UI\\Uno.Extensions.Maui.WinUI.csproj",
+ "..\\..\\src\\Uno.Extensions.Navigation.Generators\\Uno.Extensions.Navigation.Generators.csproj",
+ "..\\..\\src\\Uno.Extensions.Navigation.Toolkit\\Uno.Extensions.Navigation.Toolkit.WinUI.csproj",
+ "..\\..\\src\\Uno.Extensions.Navigation.UI\\Uno.Extensions.Navigation.WinUI.csproj",
+ "..\\..\\src\\Uno.Extensions.Navigation\\Uno.Extensions.Navigation.csproj",
+ "..\\..\\src\\Uno.Extensions.Serialization\\Uno.Extensions.Serialization.csproj",
+ "..\\..\\src\\Uno.Extensions.Storage.UI\\Uno.Extensions.Storage.WinUI.csproj",
+ "..\\..\\src\\Uno.Extensions.Storage\\Uno.Extensions.Storage.csproj",
+ "..\\..\\src\\Uno.Extensions.Toolkit.UI\\Uno.Extensions.Toolkit.WinUI.csproj",
+ "..\\..\\src\\Uno.Extensions.Toolkit\\Uno.Extensions.Toolkit.csproj",
+ "..\\..\\src\\Uno.Extensions\\Uno.Extensions.csproj",
+ "..\\MauiProjects\\MauiApp1\\MauiApp1.csproj",
+ "..\\MauiProjects\\MauiControlsExternal\\MauiControlsExternal.csproj",
+ "MauiEmbedding.Mobile\\MauiEmbedding.Mobile.csproj",
+ "MauiEmbedding\\MauiEmbedding.csproj"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding.Base/AppHead.xaml b/samples/MauiEmbedding/MauiEmbedding.Base/AppHead.xaml
new file mode 100644
index 0000000000..c54f963a95
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Base/AppHead.xaml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Base/AppHead.xaml.cs b/samples/MauiEmbedding/MauiEmbedding.Base/AppHead.xaml.cs
new file mode 100644
index 0000000000..7cb8fdbc70
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Base/AppHead.xaml.cs
@@ -0,0 +1,28 @@
+using Microsoft.UI.Xaml;
+using Uno.Resizetizer;
+
+namespace MauiEmbedding;
+
+public sealed partial class AppHead : App
+{
+ ///
+ /// 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 AppHead()
+ {
+ this.InitializeComponent();
+ }
+
+ ///
+ /// 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 args)
+ {
+ base.OnLaunched(args);
+
+ MainWindow.SetWindowIcon();
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding.Base/Icons/appconfig.svg b/samples/MauiEmbedding/MauiEmbedding.Base/Icons/appconfig.svg
new file mode 100644
index 0000000000..3106b1a8b0
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Base/Icons/appconfig.svg
@@ -0,0 +1,137 @@
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Base/Icons/iconapp.svg b/samples/MauiEmbedding/MauiEmbedding.Base/Icons/iconapp.svg
new file mode 100644
index 0000000000..f621ea597f
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Base/Icons/iconapp.svg
@@ -0,0 +1,42 @@
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Base/Splash/splash_screen.svg b/samples/MauiEmbedding/MauiEmbedding.Base/Splash/splash_screen.svg
new file mode 100644
index 0000000000..3106b1a8b0
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Base/Splash/splash_screen.svg
@@ -0,0 +1,137 @@
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Base/base.props b/samples/MauiEmbedding/MauiEmbedding.Base/base.props
new file mode 100644
index 0000000000..6c37f9c202
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Base/base.props
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/AndroidManifest.xml b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/AndroidManifest.xml
new file mode 100644
index 0000000000..95ae07533a
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Assets/AboutAssets.txt b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Assets/AboutAssets.txt
new file mode 100644
index 0000000000..210a93b801
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Assets/AboutAssets.txt
@@ -0,0 +1,22 @@
+To add cross-platform image assets for your Uno Platform app, use the Assets folder
+in the shared project instead. Assets in this folder are Android-only assets.
+
+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");
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Main.Android.cs b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Main.Android.cs
new file mode 100644
index 0000000000..289716925c
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Main.Android.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Android.App;
+using Android.Content;
+using Android.OS;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Com.Nostra13.Universalimageloader.Core;
+using Microsoft.UI.Xaml.Media;
+
+
+[assembly: Android.App.UsesPermission(Android.Manifest.Permission.BatteryStats)]
+namespace MauiEmbedding.Droid;
+
+[global::Android.App.ApplicationAttribute(
+ Label = "@string/ApplicationName",
+ Icon = "@mipmap/iconapp",
+ LargeHeap = true,
+ HardwareAccelerated = true,
+ Theme = "@style/AppTheme"
+)]
+public class Application : Microsoft.UI.Xaml.NativeApplication
+{
+ public Application(IntPtr javaReference, JniHandleOwnership transfer)
+ : base(() => new AppHead(), javaReference, transfer)
+ {
+ ConfigureUniversalImageLoader();
+ }
+
+ private static 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/MauiEmbedding/MauiEmbedding.Mobile/Android/MainActivity.Android.cs b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/MainActivity.Android.cs
new file mode 100644
index 0000000000..20ccd18d35
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/MainActivity.Android.cs
@@ -0,0 +1,16 @@
+using Android.App;
+using Android.Widget;
+using Android.OS;
+using Android.Content.PM;
+using Android.Views;
+
+namespace MauiEmbedding.Droid;
+
+[Activity(
+ MainLauncher = true,
+ ConfigurationChanges = global::Uno.UI.ActivityHelper.AllConfigChanges,
+ WindowSoftInputMode = SoftInput.AdjustNothing | SoftInput.StateHidden
+)]
+public class MainActivity : Microsoft.UI.Xaml.ApplicationActivity
+{
+}
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/AboutResources.txt b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/AboutResources.txt
new file mode 100644
index 0000000000..17e3b13335
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/AboutResources.txt
@@ -0,0 +1,47 @@
+To add cross-platform image assets for your Uno Platform app, use the Assets folder
+in the shared project instead. Resources in this folder are Android-only.
+
+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.
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/values/Strings.xml b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/values/Strings.xml
new file mode 100644
index 0000000000..abd7ff5a57
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/values/Strings.xml
@@ -0,0 +1,5 @@
+
+
+ Hello World, Click Me!
+ MauiEmbedding
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/values/Styles.xml b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/values/Styles.xml
new file mode 100644
index 0000000000..c02bd06f71
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/values/Styles.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/environment.conf b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/environment.conf
new file mode 100644
index 0000000000..fa6c2e32bf
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/environment.conf
@@ -0,0 +1,2 @@
+# See this for more details: http://developer.xamarin.com/guides/android/advanced_topics/garbage_collection/
+MONO_GC_PARAMS=bridge-implementation=tarjan,nursery-size=32m,soft-heap-limit=256m
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Entitlements.plist b/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Entitlements.plist
new file mode 100644
index 0000000000..24c3103683
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Info.plist b/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Info.plist
new file mode 100644
index 0000000000..5a4053db46
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Info.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ UIDeviceFamily
+
+ 2
+
+ LSApplicationCategoryType
+ public.app-category.utilities
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/iconapp.appiconset
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Main.maccatalyst.cs b/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Main.maccatalyst.cs
new file mode 100644
index 0000000000..b0ce2d59c1
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Main.maccatalyst.cs
@@ -0,0 +1,14 @@
+using UIKit;
+
+namespace MauiEmbedding.MacCatalyst;
+
+public class EntryPoint
+{
+ // This is the main entry point of the application.
+ public static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppHead));
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json b/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json
new file mode 100644
index 0000000000..69555e4406
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json
@@ -0,0 +1,58 @@
+{
+ "images": [
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "size": "640x960",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "subtype": "retina4",
+ "scale": "2x",
+ "size": "640x1136",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "1x",
+ "size": "768x1024",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "1x",
+ "size": "1024x768",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "size": "1536x2048",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "size": "2048x1536",
+ "idiom": "ipad"
+ }
+ ],
+ "properties": {},
+ "info": {
+ "version": 1,
+ "author": ""
+ }
+}
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj b/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj
new file mode 100644
index 0000000000..00b520193e
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj
@@ -0,0 +1,87 @@
+
+
+
+
+
+ net7.0-ios;net7.0-android;net7.0-maccatalyst
+ true
+ Exe
+
+ MauiEmbedding
+
+ com.unoplatform.mauiembedding
+ 58504DCB-2B66-4AAF-AE19-C19BB1292EC9
+
+ 1.0
+ 1
+
+ Android\AndroidManifest.xml
+
+
+
+
+ True
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(MtouchExtraArgs) --setenv=MONO_GC_PARAMS=soft-heap-limit=512m,nursery-size=64m,evacuation-threshold=66,major=marksweep,concurrent-sweep
+
+ $(MtouchExtraArgs) --registrar:static
+ iossimulator-x64
+
+
+
+ $(MtouchExtraArgs) --marshal-objectivec-exceptions:disable
+
+
+
+
+
+
+
+
+
+
+ $(MtouchExtraArgs) --setenv=MONO_GC_PARAMS=soft-heap-limit=512m,nursery-size=64m,evacuation-threshold=66,major=marksweep,concurrent-sweep
+
+ $(MtouchExtraArgs) --registrar:static
+
+ false
+ maccatalyst-x64
+
+
+
+ $(MtouchExtraArgs) --marshal-objectivec-exceptions:disable
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Entitlements.plist b/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Entitlements.plist
new file mode 100644
index 0000000000..24c3103683
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Info.plist b/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Info.plist
new file mode 100644
index 0000000000..981d8e7287
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Info.plist
@@ -0,0 +1,43 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+ XSAppIconAssets
+ Assets.xcassets/iconapp.appiconset
+ UIApplicationSupportsIndirectInputEvents
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Main.iOS.cs b/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Main.iOS.cs
new file mode 100644
index 0000000000..bbaec9ad55
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Main.iOS.cs
@@ -0,0 +1,14 @@
+using UIKit;
+
+namespace MauiEmbedding.iOS;
+
+public class EntryPoint
+{
+ // This is the main entry point of the application.
+ public static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppHead));
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json b/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json
new file mode 100644
index 0000000000..69555e4406
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json
@@ -0,0 +1,58 @@
+{
+ "images": [
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "size": "640x960",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "subtype": "retina4",
+ "scale": "2x",
+ "size": "640x1136",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "1x",
+ "size": "768x1024",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "1x",
+ "size": "1024x768",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "size": "1536x2048",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "size": "2048x1536",
+ "idiom": "ipad"
+ }
+ ],
+ "properties": {},
+ "info": {
+ "version": 1,
+ "author": ""
+ }
+}
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding.Windows/MauiEmbedding.Windows.csproj b/samples/MauiEmbedding/MauiEmbedding.Windows/MauiEmbedding.Windows.csproj
new file mode 100644
index 0000000000..13da2145ca
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Windows/MauiEmbedding.Windows.csproj
@@ -0,0 +1,83 @@
+
+
+
+
+
+ WinExe
+ net7.0-windows10.0.19041.0
+ 10.0.18362.0
+ MauiEmbedding.Windows
+ app.manifest
+ x86;x64;arm64
+ win10-x86;win10-x64;win10-arm64
+ win10-$(Platform).pubxml
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Windows/Package.appxmanifest b/samples/MauiEmbedding/MauiEmbedding.Windows/Package.appxmanifest
new file mode 100644
index 0000000000..b6ab2f76c8
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Windows/Package.appxmanifest
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+ MauiEmbedding
+ Uno Platform
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-arm64.pubxml b/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-arm64.pubxml
new file mode 100644
index 0000000000..a132e44c64
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-arm64.pubxml
@@ -0,0 +1,20 @@
+
+
+
+
+ FileSystem
+ arm64
+ win10-arm64
+ bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\
+ true
+ False
+ False
+ True
+
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-x64.pubxml b/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-x64.pubxml
new file mode 100644
index 0000000000..26ea7e55c1
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-x64.pubxml
@@ -0,0 +1,20 @@
+
+
+
+
+ FileSystem
+ x64
+ win10-x64
+ bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\
+ true
+ False
+ False
+ True
+
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-x86.pubxml b/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-x86.pubxml
new file mode 100644
index 0000000000..34d14d4d4a
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-x86.pubxml
@@ -0,0 +1,20 @@
+
+
+
+
+ FileSystem
+ x86
+ win10-x86
+ bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\
+ true
+ False
+ False
+ True
+
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/launchSettings.json b/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/launchSettings.json
new file mode 100644
index 0000000000..f714d39559
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Windows/Properties/launchSettings.json
@@ -0,0 +1,7 @@
+{
+ "profiles": {
+ "MauiEmbedding.Windows (Package)": {
+ "commandName": "MsixPackage"
+ }
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding.Windows/Resources.lang-en-us.resw b/samples/MauiEmbedding/MauiEmbedding.Windows/Resources.lang-en-us.resw
new file mode 100644
index 0000000000..fad04be560
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Windows/Resources.lang-en-us.resw
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Hello World!
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding.Windows/app.manifest b/samples/MauiEmbedding/MauiEmbedding.Windows/app.manifest
new file mode 100644
index 0000000000..f91b021435
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.Windows/app.manifest
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding.sln b/samples/MauiEmbedding/MauiEmbedding.sln
new file mode 100644
index 0000000000..daf5cad880
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding.sln
@@ -0,0 +1,916 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.2.32210.308
+MinimumVisualStudioVersion = 15.0.26124.0
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{D958D411-DCBD-4FBF-828F-FDD7059862EA}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{1C130CF4-EEF4-44D9-9DEF-C037FE1C221B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiEmbedding", "MauiEmbedding\MauiEmbedding.csproj", "{9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiEmbedding.Mobile", "MauiEmbedding.Mobile\MauiEmbedding.Mobile.csproj", "{ECE58AAC-4F80-4C00-B700-232713088962}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiEmbedding.Windows", "MauiEmbedding.Windows\MauiEmbedding.Windows.csproj", "{DC95E667-9456-4F12-BE0C-2C7F601F7259}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BADA71DC-7FFD-4EDC-9F28-FB74AEADC713}"
+ ProjectSection(SolutionItems) = preProject
+ MauiEmbedding.Base\base.props = MauiEmbedding.Base\base.props
+ Directory.Build.props = Directory.Build.props
+ Directory.Build.targets = Directory.Build.targets
+ Directory.Packages.props = Directory.Packages.props
+ global.json = global.json
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Maui.WinUI", "..\..\src\Uno.Extensions.Maui.UI\Uno.Extensions.Maui.WinUI.csproj", "{E979B964-15B6-47A1-9ABC-7A2CAB2286E9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Hosting.WinUI", "..\..\src\Uno.Extensions.Hosting.UI\Uno.Extensions.Hosting.WinUI.csproj", "{73A0899C-7167-45A6-9A02-C258E731C63C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Storage.WinUI", "..\..\src\Uno.Extensions.Storage.UI\Uno.Extensions.Storage.WinUI.csproj", "{32584367-89CC-4AC8-A11B-11970D4ADC4D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Configuration", "..\..\src\Uno.Extensions.Configuration\Uno.Extensions.Configuration.csproj", "{5983C05B-B8E4-4E52-A618-2F361162D29A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Hosting", "..\..\src\Uno.Extensions.Hosting\Uno.Extensions.Hosting.csproj", "{7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Logging.WinUI", "..\..\src\Uno.Extensions.Logging\Uno.Extensions.Logging.WinUI.csproj", "{5A155E10-0360-41F9-8DEF-E4F94509B61A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Logging.Serilog", "..\..\src\Uno.Extensions.Logging.Serilog\Uno.Extensions.Logging.Serilog.csproj", "{F5906AA3-237C-4B44-8C74-D6417DD33850}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Navigation", "..\..\src\Uno.Extensions.Navigation\Uno.Extensions.Navigation.csproj", "{AB41FC9C-859B-47F5-8FFC-741938F3C099}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Navigation.Toolkit.WinUI", "..\..\src\Uno.Extensions.Navigation.Toolkit\Uno.Extensions.Navigation.Toolkit.WinUI.csproj", "{9AB773B0-3B62-42B2-9DB9-AD8297765374}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Navigation.WinUI", "..\..\src\Uno.Extensions.Navigation.UI\Uno.Extensions.Navigation.WinUI.csproj", "{53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Core", "..\..\src\Uno.Extensions.Core\Uno.Extensions.Core.csproj", "{7F48669D-C9E9-4C05-9DC0-94557E4642E2}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Core.WinUI", "..\..\src\Uno.Extensions.Core.UI\Uno.Extensions.Core.WinUI.csproj", "{9C3744BE-A2E5-4106-B741-4A102932AF90}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Localization", "..\..\src\Uno.Extensions.Localization\Uno.Extensions.Localization.csproj", "{87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Localization.WinUI", "..\..\src\Uno.Extensions.Localization.UI\Uno.Extensions.Localization.WinUI.csproj", "{4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Navigation.Generators", "..\..\src\Uno.Extensions.Navigation.Generators\Uno.Extensions.Navigation.Generators.csproj", "{9585696E-CAEF-4DC2-B612-7681C9B0FDDF}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Core.Generators", "..\..\src\Uno.Extensions.Core.Generators\Uno.Extensions.Core.Generators.csproj", "{3E84B7A1-D829-46AE-9E95-55E691FA7328}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Storage", "..\..\src\Uno.Extensions.Storage\Uno.Extensions.Storage.csproj", "{84B26485-ACDE-46A4-BA02-D50C51FA1C71}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Serialization", "..\..\src\Uno.Extensions.Serialization\Uno.Extensions.Serialization.csproj", "{55DB6D52-3E70-465E-86C4-EDD45E84149D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Logging.WinUI.Skia", "..\..\src\Uno.Extensions.Logging\Uno.Extensions.Logging.WinUI.Skia.csproj", "{521D1D95-8E04-4CE1-9941-31B8247CDFEF}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Logging.WinUI.Wasm", "..\..\src\Uno.Extensions.Logging\Uno.Extensions.Logging.WinUI.Wasm.csproj", "{353174B7-F26F-455B-9B42-DC750037315D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Hosting.WinUI.Skia", "..\..\src\Uno.Extensions.Hosting.UI\Uno.Extensions.Hosting.WinUI.Skia.csproj", "{32BD5829-65A9-406E-97D8-752556E23B2B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Hosting.WinUI.Wasm", "..\..\src\Uno.Extensions.Hosting.UI\Uno.Extensions.Hosting.WinUI.Wasm.csproj", "{8493BB1F-62E7-4E18-92A6-4DD5635DCA32}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions Items", "Extensions Items", "{9F4A5914-3D10-4CDE-829C-BE53A9E441DB}"
+ ProjectSection(SolutionItems) = preProject
+ ..\..\src\Directory.Build.props = ..\..\src\Directory.Build.props
+ ..\..\src\Directory.Build.targets = ..\..\src\Directory.Build.targets
+ ..\..\src\Directory.Packages.props = ..\..\src\Directory.Packages.props
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MauiProjects", "MauiProjects", "{24511BF4-9869-4773-AF84-CC8F79AF5085}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiControlsExternal", "MauiProjects\MauiControlsExternal\MauiControlsExternal.csproj", "{A158CC84-0219-4BE4-A3F2-7AB7F613855A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiApp1", "MauiProjects\MauiApp1\MauiApp1.csproj", "{8577882E-DA52-4D27-A529-C70998034566}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ 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
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|ARM.Build.0 = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|x64.Build.0 = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Debug|x86.Build.0 = Debug|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|ARM.ActiveCfg = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|ARM.Build.0 = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|ARM64.Build.0 = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|iPhone.Build.0 = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|x64.ActiveCfg = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|x64.Build.0 = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|x86.ActiveCfg = Release|Any CPU
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5}.Release|x86.Build.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|ARM.Build.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|ARM.Deploy.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|ARM64.Deploy.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|x64.Build.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|x64.Deploy.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|x86.Build.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Debug|x86.Deploy.0 = Debug|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|ARM.ActiveCfg = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|ARM.Build.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|ARM.Deploy.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|ARM64.Build.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|ARM64.Deploy.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|iPhone.Build.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|x64.ActiveCfg = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|x64.Build.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|x64.Deploy.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|x86.ActiveCfg = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|x86.Build.0 = Release|Any CPU
+ {ECE58AAC-4F80-4C00-B700-232713088962}.Release|x86.Deploy.0 = Release|Any CPU
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|Any CPU.ActiveCfg = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|Any CPU.Build.0 = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|Any CPU.Deploy.0 = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|ARM.ActiveCfg = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|ARM.Build.0 = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|ARM.Deploy.0 = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|ARM64.ActiveCfg = Debug|arm64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|ARM64.Build.0 = Debug|arm64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|ARM64.Deploy.0 = Debug|arm64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|iPhone.ActiveCfg = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|iPhone.Build.0 = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|iPhone.Deploy.0 = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|iPhoneSimulator.ActiveCfg = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|iPhoneSimulator.Build.0 = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|iPhoneSimulator.Deploy.0 = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|x64.ActiveCfg = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|x64.Build.0 = Debug|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|x86.ActiveCfg = Debug|x86
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Debug|x86.Build.0 = Debug|x86
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|Any CPU.ActiveCfg = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|Any CPU.Build.0 = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|Any CPU.Deploy.0 = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|ARM.ActiveCfg = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|ARM.Build.0 = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|ARM64.ActiveCfg = Release|arm64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|ARM64.Build.0 = Release|arm64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|iPhone.ActiveCfg = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|iPhone.Build.0 = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|iPhoneSimulator.ActiveCfg = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|iPhoneSimulator.Build.0 = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|x64.ActiveCfg = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|x64.Build.0 = Release|x64
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|x86.ActiveCfg = Release|x86
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259}.Release|x86.Build.0 = Release|x86
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|ARM.Build.0 = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|x64.Build.0 = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Debug|x86.Build.0 = Debug|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|ARM.ActiveCfg = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|ARM.Build.0 = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|ARM64.Build.0 = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|iPhone.Build.0 = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|x64.ActiveCfg = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|x64.Build.0 = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|x86.ActiveCfg = Release|Any CPU
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9}.Release|x86.Build.0 = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|ARM.Build.0 = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|x64.Build.0 = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Debug|x86.Build.0 = Debug|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|ARM.ActiveCfg = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|ARM.Build.0 = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|ARM64.Build.0 = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|iPhone.Build.0 = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|x64.ActiveCfg = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|x64.Build.0 = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|x86.ActiveCfg = Release|Any CPU
+ {73A0899C-7167-45A6-9A02-C258E731C63C}.Release|x86.Build.0 = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|ARM.Build.0 = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|x64.Build.0 = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Debug|x86.Build.0 = Debug|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|ARM.ActiveCfg = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|ARM.Build.0 = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|ARM64.Build.0 = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|iPhone.Build.0 = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|x64.ActiveCfg = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|x64.Build.0 = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|x86.ActiveCfg = Release|Any CPU
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D}.Release|x86.Build.0 = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|ARM.Build.0 = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|x64.Build.0 = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Debug|x86.Build.0 = Debug|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|ARM.ActiveCfg = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|ARM.Build.0 = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|ARM64.Build.0 = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|iPhone.Build.0 = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|x64.ActiveCfg = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|x64.Build.0 = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|x86.ActiveCfg = Release|Any CPU
+ {5983C05B-B8E4-4E52-A618-2F361162D29A}.Release|x86.Build.0 = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|ARM.Build.0 = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|x64.Build.0 = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Debug|x86.Build.0 = Debug|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|ARM.ActiveCfg = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|ARM.Build.0 = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|ARM64.Build.0 = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|iPhone.Build.0 = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|x64.ActiveCfg = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|x64.Build.0 = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|x86.ActiveCfg = Release|Any CPU
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D}.Release|x86.Build.0 = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|ARM.Build.0 = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|x64.Build.0 = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Debug|x86.Build.0 = Debug|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|ARM.ActiveCfg = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|ARM.Build.0 = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|ARM64.Build.0 = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|iPhone.Build.0 = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|x64.ActiveCfg = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|x64.Build.0 = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|x86.ActiveCfg = Release|Any CPU
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A}.Release|x86.Build.0 = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|ARM.Build.0 = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|x64.Build.0 = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Debug|x86.Build.0 = Debug|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|ARM.ActiveCfg = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|ARM.Build.0 = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|ARM64.Build.0 = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|iPhone.Build.0 = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|x64.ActiveCfg = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|x64.Build.0 = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|x86.ActiveCfg = Release|Any CPU
+ {F5906AA3-237C-4B44-8C74-D6417DD33850}.Release|x86.Build.0 = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|ARM.Build.0 = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|x64.Build.0 = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Debug|x86.Build.0 = Debug|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|ARM.ActiveCfg = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|ARM.Build.0 = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|ARM64.Build.0 = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|iPhone.Build.0 = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|x64.ActiveCfg = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|x64.Build.0 = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|x86.ActiveCfg = Release|Any CPU
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099}.Release|x86.Build.0 = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|ARM.Build.0 = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|x64.Build.0 = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Debug|x86.Build.0 = Debug|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|ARM.ActiveCfg = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|ARM.Build.0 = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|ARM64.Build.0 = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|iPhone.Build.0 = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|x64.ActiveCfg = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|x64.Build.0 = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|x86.ActiveCfg = Release|Any CPU
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374}.Release|x86.Build.0 = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|ARM.Build.0 = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|x64.Build.0 = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Debug|x86.Build.0 = Debug|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|ARM.ActiveCfg = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|ARM.Build.0 = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|ARM64.Build.0 = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|iPhone.Build.0 = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|x64.ActiveCfg = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|x64.Build.0 = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|x86.ActiveCfg = Release|Any CPU
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E}.Release|x86.Build.0 = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|ARM.Build.0 = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|x64.Build.0 = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Debug|x86.Build.0 = Debug|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|ARM.ActiveCfg = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|ARM.Build.0 = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|ARM64.Build.0 = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|iPhone.Build.0 = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|x64.ActiveCfg = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|x64.Build.0 = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|x86.ActiveCfg = Release|Any CPU
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2}.Release|x86.Build.0 = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|ARM.Build.0 = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|x64.Build.0 = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Debug|x86.Build.0 = Debug|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|ARM.ActiveCfg = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|ARM.Build.0 = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|ARM64.Build.0 = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|iPhone.Build.0 = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|x64.ActiveCfg = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|x64.Build.0 = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|x86.ActiveCfg = Release|Any CPU
+ {9C3744BE-A2E5-4106-B741-4A102932AF90}.Release|x86.Build.0 = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|ARM.Build.0 = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|x64.Build.0 = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Debug|x86.Build.0 = Debug|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|ARM.ActiveCfg = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|ARM.Build.0 = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|ARM64.Build.0 = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|iPhone.Build.0 = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|x64.ActiveCfg = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|x64.Build.0 = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|x86.ActiveCfg = Release|Any CPU
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D}.Release|x86.Build.0 = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|ARM.Build.0 = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|x64.Build.0 = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Debug|x86.Build.0 = Debug|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|ARM.ActiveCfg = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|ARM.Build.0 = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|ARM64.Build.0 = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|iPhone.Build.0 = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|x64.ActiveCfg = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|x64.Build.0 = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|x86.ActiveCfg = Release|Any CPU
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD}.Release|x86.Build.0 = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|ARM.Build.0 = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|x64.Build.0 = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Debug|x86.Build.0 = Debug|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|ARM.ActiveCfg = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|ARM.Build.0 = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|ARM64.Build.0 = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|iPhone.Build.0 = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|x64.ActiveCfg = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|x64.Build.0 = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|x86.ActiveCfg = Release|Any CPU
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF}.Release|x86.Build.0 = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|ARM.Build.0 = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|x64.Build.0 = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Debug|x86.Build.0 = Debug|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|ARM.ActiveCfg = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|ARM.Build.0 = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|ARM64.Build.0 = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|iPhone.Build.0 = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|x64.ActiveCfg = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|x64.Build.0 = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|x86.ActiveCfg = Release|Any CPU
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328}.Release|x86.Build.0 = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|ARM.Build.0 = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|x64.Build.0 = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Debug|x86.Build.0 = Debug|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|Any CPU.Build.0 = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|ARM.ActiveCfg = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|ARM.Build.0 = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|ARM64.Build.0 = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|iPhone.Build.0 = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|x64.ActiveCfg = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|x64.Build.0 = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|x86.ActiveCfg = Release|Any CPU
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71}.Release|x86.Build.0 = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|ARM.Build.0 = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|x64.Build.0 = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Debug|x86.Build.0 = Debug|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|ARM.ActiveCfg = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|ARM.Build.0 = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|ARM64.Build.0 = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|iPhone.Build.0 = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|x64.ActiveCfg = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|x64.Build.0 = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|x86.ActiveCfg = Release|Any CPU
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D}.Release|x86.Build.0 = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|ARM.Build.0 = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|x64.Build.0 = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Debug|x86.Build.0 = Debug|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|ARM.ActiveCfg = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|ARM.Build.0 = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|ARM64.Build.0 = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|iPhone.Build.0 = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|x64.ActiveCfg = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|x64.Build.0 = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|x86.ActiveCfg = Release|Any CPU
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF}.Release|x86.Build.0 = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|ARM.Build.0 = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|x64.Build.0 = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Debug|x86.Build.0 = Debug|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|ARM.ActiveCfg = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|ARM.Build.0 = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|ARM64.Build.0 = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|iPhone.Build.0 = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|x64.ActiveCfg = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|x64.Build.0 = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|x86.ActiveCfg = Release|Any CPU
+ {353174B7-F26F-455B-9B42-DC750037315D}.Release|x86.Build.0 = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|ARM.Build.0 = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|x64.Build.0 = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Debug|x86.Build.0 = Debug|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|ARM.ActiveCfg = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|ARM.Build.0 = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|ARM64.Build.0 = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|iPhone.Build.0 = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|x64.ActiveCfg = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|x64.Build.0 = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|x86.ActiveCfg = Release|Any CPU
+ {32BD5829-65A9-406E-97D8-752556E23B2B}.Release|x86.Build.0 = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|ARM.Build.0 = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|x64.Build.0 = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Debug|x86.Build.0 = Debug|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|ARM.ActiveCfg = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|ARM.Build.0 = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|ARM64.Build.0 = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|iPhone.Build.0 = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|x64.ActiveCfg = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|x64.Build.0 = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|x86.ActiveCfg = Release|Any CPU
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32}.Release|x86.Build.0 = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|ARM.Build.0 = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|x64.Build.0 = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Debug|x86.Build.0 = Debug|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|ARM.ActiveCfg = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|ARM.Build.0 = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|ARM64.Build.0 = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|iPhone.Build.0 = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|x64.ActiveCfg = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|x64.Build.0 = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|x86.ActiveCfg = Release|Any CPU
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A}.Release|x86.Build.0 = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|ARM.Build.0 = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|x64.Build.0 = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Debug|x86.Build.0 = Debug|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|ARM.ActiveCfg = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|ARM.Build.0 = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|ARM64.Build.0 = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|iPhone.Build.0 = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|x64.ActiveCfg = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|x64.Build.0 = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|x86.ActiveCfg = Release|Any CPU
+ {8577882E-DA52-4D27-A529-C70998034566}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {1C130CF4-EEF4-44D9-9DEF-C037FE1C221B} = {D958D411-DCBD-4FBF-828F-FDD7059862EA}
+ {9A77D6D1-608D-4409-A0D9-FDD8AEF3BCC5} = {D958D411-DCBD-4FBF-828F-FDD7059862EA}
+ {ECE58AAC-4F80-4C00-B700-232713088962} = {1C130CF4-EEF4-44D9-9DEF-C037FE1C221B}
+ {DC95E667-9456-4F12-BE0C-2C7F601F7259} = {1C130CF4-EEF4-44D9-9DEF-C037FE1C221B}
+ {E979B964-15B6-47A1-9ABC-7A2CAB2286E9} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {73A0899C-7167-45A6-9A02-C258E731C63C} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {32584367-89CC-4AC8-A11B-11970D4ADC4D} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {5983C05B-B8E4-4E52-A618-2F361162D29A} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {7C62EA57-BBDF-4ED2-85DD-A6F5D9BA9E9D} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {5A155E10-0360-41F9-8DEF-E4F94509B61A} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {F5906AA3-237C-4B44-8C74-D6417DD33850} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {AB41FC9C-859B-47F5-8FFC-741938F3C099} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {9AB773B0-3B62-42B2-9DB9-AD8297765374} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {53C1726A-8DD8-44C8-8A0B-FD21FFC03A6E} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {7F48669D-C9E9-4C05-9DC0-94557E4642E2} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {9C3744BE-A2E5-4106-B741-4A102932AF90} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {87FD59DC-30CC-4E9D-AF91-6420BF3E8E8D} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {4054EC53-5C82-4D2A-8FE8-A8BBFA9AA4AD} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {9585696E-CAEF-4DC2-B612-7681C9B0FDDF} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {3E84B7A1-D829-46AE-9E95-55E691FA7328} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {84B26485-ACDE-46A4-BA02-D50C51FA1C71} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {55DB6D52-3E70-465E-86C4-EDD45E84149D} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {521D1D95-8E04-4CE1-9941-31B8247CDFEF} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {353174B7-F26F-455B-9B42-DC750037315D} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {32BD5829-65A9-406E-97D8-752556E23B2B} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {8493BB1F-62E7-4E18-92A6-4DD5635DCA32} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {9F4A5914-3D10-4CDE-829C-BE53A9E441DB} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366}
+ {A158CC84-0219-4BE4-A3F2-7AB7F613855A} = {24511BF4-9869-4773-AF84-CC8F79AF5085}
+ {8577882E-DA52-4D27-A529-C70998034566} = {24511BF4-9869-4773-AF84-CC8F79AF5085}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {584E156C-C094-4968-8A1F-3FB06081E34D}
+ EndGlobalSection
+EndGlobal
diff --git a/samples/MauiEmbedding/MauiEmbedding/App.cs b/samples/MauiEmbedding/MauiEmbedding/App.cs
new file mode 100644
index 0000000000..4f89478676
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/App.cs
@@ -0,0 +1,132 @@
+using CommunityToolkit.Maui;
+using Microsoft.Maui;
+//using Telerik.Maui.Controls;
+//using Telerik.Maui.Controls.Compatibility;
+using MControls = Microsoft.Maui.Controls;
+using MauiControlsExternal;
+using Esri.ArcGISRuntime.Maui;
+
+namespace MauiEmbedding;
+
+public class App : Application
+{
+ protected Window? MainWindow { get; private set; }
+ protected IHost? Host { get; private set; }
+
+ public App()
+ {
+ UnoMusicApp.Helpers.ThreadHelpers.Init(SynchronizationContext.Current!);
+ }
+
+ protected async override void OnLaunched(LaunchActivatedEventArgs args)
+ {
+ var builder = this.CreateBuilder(args)
+ .UseMauiEmbedding(maui =>
+ {
+
+ maui
+ .UseMauiCommunityToolkit()
+ .UseArcGISRuntime()
+ //.UseTelerik()
+ //.UseTelerikControls()
+ .UseCustomLibrary();
+
+ Microsoft.Maui.Handlers.ShapeViewHandler.Mapper.AppendToMapping("BackgroundColor", (h, v) =>
+ {
+ if (v is MControls.BoxView boxview)
+ {
+ boxview.Background = MControls.Brush.Fuchsia;
+ Microsoft.Maui.Handlers.ShapeViewHandler.MapBackground(h, boxview);
+ }
+ });
+ })
+ // Add navigation support for toolkit controls such as TabBar and NavigationView
+ .UseToolkitNavigation()
+ .Configure(host => host
+#if DEBUG
+ // Switch to Development environment when running in DEBUG
+ .UseEnvironment(Environments.Development)
+#endif
+ .UseLogging(configure: (context, logBuilder) =>
+ {
+ // Configure log levels for different categories of logging
+ logBuilder
+ .SetMinimumLevel(
+ context.HostingEnvironment.IsDevelopment() ?
+ LogLevel.Information :
+ LogLevel.Warning)
+
+ // Default filters for core Uno Platform namespaces
+ .CoreLogLevel(LogLevel.Warning);
+
+ // Uno Platform namespace filter groups
+ // Uncomment individual methods to see more detailed logging
+ //// Generic Xaml events
+ //logBuilder.XamlLogLevel(LogLevel.Debug);
+ //// Layouter specific messages
+ //logBuilder.XamlLayoutLogLevel(LogLevel.Debug);
+ //// Storage messages
+ //logBuilder.StorageLogLevel(LogLevel.Debug);
+ //// Binding related messages
+ //logBuilder.XamlBindingLogLevel(LogLevel.Debug);
+ //// Binder memory references tracking
+ //logBuilder.BinderMemoryReferenceLogLevel(LogLevel.Debug);
+ //// RemoteControl and HotReload related
+ //logBuilder.HotReloadCoreLogLevel(LogLevel.Information);
+ //// Debug JS interop
+ //logBuilder.WebAssemblyLogLevel(LogLevel.Debug);
+
+ }, enableUnoLogging: true)
+ .UseSerilog(consoleLoggingEnabled: true, fileLoggingEnabled: true)
+ .UseConfiguration(configure: configBuilder =>
+ configBuilder
+ .EmbeddedSource()
+ .Section()
+ )
+ // Enable localization (see appsettings.json for supported languages)
+ .UseLocalization()
+ .ConfigureServices((context, services) =>
+ {
+ // TODO: Register your services
+ //services.AddSingleton();
+ })
+ .UseNavigation(RegisterRoutes)
+ );
+ MainWindow = builder.Window;
+
+ Host = await builder.NavigateAsync();
+
+ //MainWindow.Content = new MainPage();
+ }
+
+ private static void RegisterRoutes(IViewRegistry views, IRouteRegistry routes)
+ {
+ views.Register(
+ new ViewMap(ViewModel: typeof(ShellViewModel)),
+ new ViewMap(),
+ new ViewMap(),
+ new ViewMap(),
+ //new ViewMap(),
+ new ViewMap(),
+ new ViewMap(),
+ new ViewMap(),
+ new ViewMap()
+ );
+
+ routes.Register(
+ new RouteMap("", View: views.FindByViewModel(),
+ Nested: new RouteMap[]
+ {
+ new RouteMap("Main", View: views.FindByViewModel()),
+ new RouteMap(nameof(MauiControlsViewModel), View: views.FindByViewModel()),
+ new RouteMap(nameof(MCTControlsViewModel), View: views.FindByViewModel()),
+ new RouteMap(nameof(MauiEssentialsViewModel), View: views.FindByViewModel()),
+ new RouteMap(nameof(MauiColorsViewModel), View: views.FindByViewModel()),
+ new RouteMap(nameof(EsriMapsViewModel), View: views.FindByViewModel()),
+ new RouteMap(nameof(ExternalLibPage), View: views.FindByViewModel()),
+ //new RouteMap(nameof(TelerikControlsViewModel), View: views.FindByViewModel()),
+ }
+ )
+ );
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/AppResources.xaml b/samples/MauiEmbedding/MauiEmbedding/AppResources.xaml
new file mode 100644
index 0000000000..d063d90612
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/AppResources.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Assets/Icons/back.svg b/samples/MauiEmbedding/MauiEmbedding/Assets/Icons/back.svg
new file mode 100644
index 0000000000..bcd7851b9c
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Assets/Icons/back.svg
@@ -0,0 +1,3 @@
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Assets/SharedAssets.md b/samples/MauiEmbedding/MauiEmbedding/Assets/SharedAssets.md
new file mode 100644
index 0000000000..6d84997f12
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/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/MauiEmbedding/MauiEmbedding/Business/Models/AppConfig.cs b/samples/MauiEmbedding/MauiEmbedding/Business/Models/AppConfig.cs
new file mode 100644
index 0000000000..0140825680
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Business/Models/AppConfig.cs
@@ -0,0 +1,6 @@
+namespace MauiEmbedding.Business.Models;
+
+public record AppConfig
+{
+ public string? Environment { get; init; }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Business/Models/Entity.cs b/samples/MauiEmbedding/MauiEmbedding/Business/Models/Entity.cs
new file mode 100644
index 0000000000..4a5db16300
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Business/Models/Entity.cs
@@ -0,0 +1,3 @@
+namespace MauiEmbedding.Business.Models;
+
+public record Entity(string Name);
diff --git a/samples/MauiEmbedding/MauiEmbedding/GlobalUsings.cs b/samples/MauiEmbedding/MauiEmbedding/GlobalUsings.cs
new file mode 100644
index 0000000000..a02c9e4e6c
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/GlobalUsings.cs
@@ -0,0 +1,21 @@
+global using System.Collections.Immutable;
+global using System.Windows.Input;
+global using Microsoft.Extensions.DependencyInjection;
+global using Windows.Networking.Connectivity;
+global using Windows.Storage;
+global using Microsoft.Extensions.Hosting;
+global using Microsoft.Extensions.Localization;
+global using Microsoft.Extensions.Logging;
+global using Microsoft.UI.Xaml;
+global using Microsoft.UI.Xaml.Controls;
+global using Microsoft.UI.Xaml.Media;
+global using Microsoft.UI.Xaml.Navigation;
+global using Microsoft.Extensions.Options;
+global using MauiEmbedding.Business.Models;
+global using MauiEmbedding.Presentation;
+global using Uno.Extensions;
+global using Uno.Extensions.Logging;
+global using Windows.ApplicationModel;
+global using ApplicationExecutionState = Windows.ApplicationModel.Activation.ApplicationExecutionState;
+global using CommunityToolkit.Mvvm.ComponentModel;
+global using CommunityToolkit.Mvvm.Input;
diff --git a/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj b/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj
new file mode 100644
index 0000000000..be5ace9d76
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj
@@ -0,0 +1,93 @@
+
+
+
+
+
+ $(TargetFrameworks);net7.0-windows10.0.19041
+ $(TargetFrameworks);net7.0-ios;net7.0-android;net7.0-maccatalyst
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %(Filename)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+ Analyzer
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/EsriMapsPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/EsriMapsPage.xaml
new file mode 100644
index 0000000000..b363c6c518
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/EsriMapsPage.xaml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/EsriMapsPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/EsriMapsPage.xaml.cs
new file mode 100644
index 0000000000..e6d78ea05a
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/EsriMapsPage.xaml.cs
@@ -0,0 +1,63 @@
+using Esri.ArcGISRuntime.Mapping;
+using Esri.ArcGISRuntime.Mapping.Floor;
+using Esri.ArcGISRuntime.Maui;
+using Microsoft.Maui;
+
+namespace MauiEmbedding.Presentation
+{
+ partial class EsriMapsPage : Page
+ {
+
+ private FloorManager _floorManager;
+
+ MapView mapView = new();
+ // Collection of floors.
+ private readonly Dictionary _floorOptions = new Dictionary();
+ public EsriMapsPage()
+ {
+ InitializeComponent();
+ this.grid.Add((IView)mapView);
+
+ _ = Initialize();
+ }
+
+
+ private async Task Initialize()
+ {
+ try
+ {
+ // Gets the floor data from ArcGIS Online and creates a map with it.
+ Map map = new Map(new Uri("https://ess.maps.arcgis.com/home/item.html?id=f133a698536f44c8884ad81f80b6cfc7"));
+
+ mapView.Map = map;
+
+ // Map needs to be loaded in order for floormanager to be used.
+ await mapView.Map.LoadAsync();
+ List floorName = new List();
+
+ // Checks to see if the layer is floor aware.
+ if (mapView.Map.FloorDefinition == null)
+ {
+ System.Diagnostics.Debug.WriteLine("The layer is not floor aware.");
+ return;
+ }
+
+ await mapView.Map.FloorManager.LoadAsync();
+ _floorManager = mapView.Map.FloorManager;
+
+ // Use the dictionary to add the level's name as the key and the FloorLevel object with the associated level's name.
+ foreach (FloorLevel level in _floorManager.Facilities[0].Levels)
+ {
+ _floorOptions.Add(level.ShortName, level);
+ floorName.Add(level.ShortName);
+ }
+
+ //FloorChooser.ItemsSource = floorName;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/EsriMapsViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/EsriMapsViewModel.cs
new file mode 100644
index 0000000000..17b605df33
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/EsriMapsViewModel.cs
@@ -0,0 +1,6 @@
+namespace MauiEmbedding.Presentation
+{
+ partial class EsriMapsViewModel : ObservableObject
+ {
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/ExternalLibPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/ExternalLibPage.xaml
new file mode 100644
index 0000000000..f50b1263ea
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/ExternalLibPage.xaml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/ExternalLibPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/ExternalLibPage.xaml.cs
new file mode 100644
index 0000000000..10efb2c863
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/ExternalLibPage.xaml.cs
@@ -0,0 +1,11 @@
+namespace MauiEmbedding.Presentation;
+
+public sealed partial class ExternalLibPage : Page
+{
+ public MainViewModel? Vm => DataContext as MainViewModel;
+
+ public ExternalLibPage()
+ {
+ this.InitializeComponent();
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/ExternalLibViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/ExternalLibViewModel.cs
new file mode 100644
index 0000000000..20109488cc
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/ExternalLibViewModel.cs
@@ -0,0 +1,6 @@
+namespace MauiEmbedding.Presentation;
+
+public partial class ExternalLibViewModel : ObservableObject
+{
+ public string Title { get; set; } = "External lib controls with Maui";
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml
new file mode 100644
index 0000000000..39845a9cd6
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml.cs
new file mode 100644
index 0000000000..5576b575f7
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Controls.Primitives;
+using Microsoft.UI.Xaml.Data;
+using Microsoft.UI.Xaml.Input;
+using Microsoft.UI.Xaml.Media;
+using Microsoft.UI.Xaml.Navigation;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+
+// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
+
+namespace MauiEmbedding.Presentation;
+///
+/// An empty page that can be used on its own or navigated to within a Frame.
+///
+public sealed partial class MCTControlsPage : Page
+{
+ public MCTControlsPage()
+ {
+ this.InitializeComponent();
+
+ var drawing = new CommunityToolkit.Maui.Views.DrawingView()
+ {
+ HeightRequest = 300,
+ WidthRequest = 300,
+ LineColor = Microsoft.Maui.Graphics.Colors.Fuchsia,
+ BackgroundColor = Microsoft.Maui.Graphics.Colors.Black,
+ IsMultiLineModeEnabled = true
+ };
+
+ this.layout.Add(drawing);
+
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsViewModel.cs
new file mode 100644
index 0000000000..c2df388aaa
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsViewModel.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MauiEmbedding.Presentation;
+partial class MCTControlsViewModel : ObservableObject
+{
+ public string Title => "CommunityToolkit.Maui controls";
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml
new file mode 100644
index 0000000000..e29f9bdc96
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml.cs
new file mode 100644
index 0000000000..b889c6af92
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml.cs
@@ -0,0 +1,18 @@
+namespace MauiEmbedding.Presentation;
+
+public sealed partial class MainPage : Page
+{
+ public MainViewModel? Vm => DataContext as MainViewModel;
+
+ public MainPage()
+ {
+ this.InitializeComponent();
+
+ DataContextChanged += MainPage_DataContextChanged;
+ }
+
+ private void MainPage_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
+ {
+
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MainViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainViewModel.cs
new file mode 100644
index 0000000000..d4b6e99611
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainViewModel.cs
@@ -0,0 +1,58 @@
+namespace MauiEmbedding.Presentation;
+
+public partial class MainViewModel : ObservableObject
+{
+ private INavigator _navigator;
+
+ [ObservableProperty]
+ private string? name;
+
+ public MainViewModel(
+ IStringLocalizer localizer,
+ IOptions appInfo,
+ INavigator navigator)
+ {
+ _navigator = navigator;
+ Title = "Main";
+ Title += $" - {localizer["ApplicationName"]}";
+ Title += $" - {appInfo?.Value?.Environment}";
+ }
+ public string? Title { get; }
+
+
+ public async Task GoToMauiControls()
+ {
+ await _navigator.NavigateViewModelAsync(this);
+ }
+
+
+ public async Task GoToCommunityToolkitMauiControls()
+ {
+ await _navigator.NavigateViewModelAsync(this);
+ }
+
+ public async Task GoToMauiEssentialsApi()
+ {
+ await _navigator.NavigateViewModelAsync(this);
+ }
+
+ public async Task GoToTelerikPage()
+ {
+ await _navigator.NavigateViewModelAsync(this);
+ }
+
+ public async Task GoToColorsPage()
+ {
+ await _navigator.NavigateViewModelAsync(this);
+ }
+
+ public async Task GoToExternalLibPage()
+ {
+ await _navigator.NavigateViewModelAsync(this);
+ }
+
+ public async Task GoToMapsPage()
+ {
+ await _navigator.NavigateViewModelAsync(this);
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiColorsPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiColorsPage.xaml
new file mode 100644
index 0000000000..df9c38207b
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiColorsPage.xaml
@@ -0,0 +1,43 @@
+
+
+
+
+ Hello from WinUI Resources
+ #169420
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiColorsPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiColorsPage.xaml.cs
new file mode 100644
index 0000000000..d537cbbe1e
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiColorsPage.xaml.cs
@@ -0,0 +1,12 @@
+namespace MauiEmbedding.Presentation
+{
+ public partial class MauiColorsPage : Page
+ {
+ public MauiColorsPage()
+ {
+ this.InitializeComponent();
+ lbl.TextColor = Microsoft.Maui.Graphics.Colors.Fuchsia;
+
+ }
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiColorsViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiColorsViewModel.cs
new file mode 100644
index 0000000000..6698585ec4
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiColorsViewModel.cs
@@ -0,0 +1,6 @@
+namespace MauiEmbedding.Presentation
+{
+ public partial class MauiColorsViewModel : ObservableObject
+ {
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsPage.xaml
new file mode 100644
index 0000000000..7c0de525c4
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsPage.xaml
@@ -0,0 +1,70 @@
+
+
+
+
+ Hello from WinUI Resources
+ #169420
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsPage.xaml.cs
new file mode 100644
index 0000000000..54f637e7f9
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsPage.xaml.cs
@@ -0,0 +1,73 @@
+using Microsoft.Maui.Controls;
+using Microsoft.Maui.Graphics;
+using Page = Microsoft.UI.Xaml.Controls.Page;
+
+// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
+
+namespace MauiEmbedding.Presentation;
+///
+/// An empty page that can be used on its own or navigated to within a Frame.
+///
+public sealed partial class MauiControlsPage : Page
+{
+ public MauiControlsPage()
+ {
+ this.InitializeComponent();
+
+ var lbl = new Label()
+ {
+ BackgroundColor = Colors.Pink
+ };
+
+ var b = new BoxView
+ {
+ HeightRequest = 300,
+ WidthRequest = 300
+ };
+
+ var source = new List { "Uno", "Maui", "WinUI" };
+
+ this.picker.ItemsSource = source;
+ var mauiBinding = new Microsoft.Maui.Controls.Binding
+ {
+ Path = nameof(MauiControlsViewModel.Name),
+ Source = DataContext
+ };
+
+ lbl.SetBinding(Label.TextProperty, mauiBinding);
+
+ this.stack.Add(lbl);
+ this.stack.Add(b);
+
+ this.lblB.BindingContextChanged += (s, e) =>
+ {
+ _ = 1;
+ _ = this.lblB.Text;
+ this.lblB.HeightRequest = 30;
+ _ = this.lblB.IsSet(Label.TextProperty);
+ };
+
+ this.lblB.PropertyChanged += (s, e) =>
+ {
+ if (e.PropertyName == "Text")
+ {
+ _ = 1;
+ }
+ };
+
+ //lblB.BackgroundColor = Microsoft.Maui.Graphics.Colors.Black;
+
+ this.mauiContent.DataContextChanged += (s, e) =>
+ {
+ _ = 1;
+ };
+
+ this.lblB.HeightRequest = 20;
+
+ this.DataContextChanged += (s, e) =>
+ {
+ _ = 1;
+ };
+
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsViewModel.cs
new file mode 100644
index 0000000000..983c4e0c5f
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsViewModel.cs
@@ -0,0 +1,23 @@
+namespace MauiEmbedding.Presentation;
+partial class MauiControlsViewModel : ObservableObject
+{
+ [ObservableProperty]
+ private string? name = "This is from the ViewModel!";
+
+ public MauiControlsViewModel(
+ IStringLocalizer localizer,
+ IOptions appInfo)
+ {
+ Title = "Main";
+ Title += $" - {localizer["ApplicationName"]}";
+ Title += $" - {appInfo?.Value?.Environment}";
+ }
+
+
+ public MauiControlsViewModel()
+ {
+ Title = "Main";
+ }
+
+ public string? Title { get; }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiEssentialsPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiEssentialsPage.xaml
new file mode 100644
index 0000000000..1f70fbf927
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiEssentialsPage.xaml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiEssentialsPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiEssentialsPage.xaml.cs
new file mode 100644
index 0000000000..ddc03cd0ab
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiEssentialsPage.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Controls.Primitives;
+using Microsoft.UI.Xaml.Data;
+using Microsoft.UI.Xaml.Input;
+using Microsoft.UI.Xaml.Media;
+using Microsoft.UI.Xaml.Navigation;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+
+// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
+
+namespace MauiEmbedding.Presentation;
+///
+/// An empty page that can be used on its own or navigated to within a Frame.
+///
+public sealed partial class MauiEssentialsPage : Page
+{
+ public MauiEssentialsPage()
+ {
+ this.InitializeComponent();
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiEssentialsViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiEssentialsViewModel.cs
new file mode 100644
index 0000000000..67b71b94f1
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MauiEssentialsViewModel.cs
@@ -0,0 +1,35 @@
+using Microsoft.Maui.Devices;
+using Uno.Extensions;
+
+namespace MauiEmbedding.Presentation;
+partial class MauiEssentialsViewModel : ObservableObject
+{
+ [ObservableProperty]
+ [NotifyPropertyChangedFor(nameof(BatteryLevelText))]
+ private double _batteryLevel;
+
+ public string BatteryLevelText => $"Battery level: {BatteryLevel * 100}%";
+
+ [ObservableProperty]
+ [NotifyPropertyChangedFor(nameof(DisplayInfo))]
+ private (double width, double height) _displaySize;
+
+ public string DisplayInfo => $"Display info: {DisplaySize.width}x{DisplaySize.height}";
+
+ public MauiEssentialsViewModel(IDispatcher dispatcher)
+ {
+ _ = dispatcher.ExecuteAsync(() =>
+ {
+ BatteryLevel = Battery.ChargeLevel;
+ DisplaySize = (DeviceDisplay.MainDisplayInfo.Width, DeviceDisplay.MainDisplayInfo.Height);
+
+ Battery.BatteryInfoChanged += OnBatteryBatteryInfoChanged;
+ DeviceDisplay.MainDisplayInfoChanged += OnDeviceDisplayChanged;
+ });
+ }
+
+ private void OnDeviceDisplayChanged(object? sender, DisplayInfoChangedEventArgs e) =>
+ DisplaySize = (e.DisplayInfo.Width, e.DisplayInfo.Height);
+ private void OnBatteryBatteryInfoChanged(object? sender, BatteryInfoChangedEventArgs e) =>
+ BatteryLevel = e.ChargeLevel;
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml
new file mode 100644
index 0000000000..9f52f65056
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml.cs
new file mode 100644
index 0000000000..89804a91a9
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml.cs
@@ -0,0 +1,10 @@
+namespace MauiEmbedding.Presentation;
+
+public sealed partial class Shell : UserControl, IContentControlProvider
+{
+ public Shell()
+ {
+ this.InitializeComponent();
+ }
+ public ContentControl ContentControl => Splash;
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/ShellViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/ShellViewModel.cs
new file mode 100644
index 0000000000..ff3d722471
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/ShellViewModel.cs
@@ -0,0 +1,18 @@
+namespace MauiEmbedding.Presentation;
+
+public class ShellViewModel
+{
+ private readonly INavigator _navigator;
+
+ public ShellViewModel(
+ INavigator navigator)
+ {
+ _navigator = navigator;
+ _ = Start();
+ }
+
+ public async Task Start()
+ {
+ await _navigator.NavigateViewModelAsync(this);
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/TelerikControlsPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/TelerikControlsPage.xaml
new file mode 100644
index 0000000000..a2e2da4b14
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/TelerikControlsPage.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/TelerikControlsPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/TelerikControlsPage.xaml.cs
new file mode 100644
index 0000000000..44659a1be6
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/TelerikControlsPage.xaml.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MauiEmbedding.Presentation;
+partial class TelerikControlsPage : Page
+{
+ public TelerikControlsPage()
+ {
+ this.InitializeComponent();
+
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/TelerikControlsViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/TelerikControlsViewModel.cs
new file mode 100644
index 0000000000..340d67c6bd
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/TelerikControlsViewModel.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MauiEmbedding.Presentation
+{
+
+ public partial class TelerikControlsViewModel : ObservableObject
+ {
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/TitleConverter.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/TitleConverter.cs
new file mode 100644
index 0000000000..09e5e3bda3
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/TitleConverter.cs
@@ -0,0 +1,9 @@
+using System.Text.RegularExpressions;
+
+namespace MauiEmbedding.Presentation;
+
+public class TitleConverter : Microsoft.UI.Xaml.Data.IValueConverter
+{
+ public object Convert(object? value, Type targetType, object parameter, string language) => $"Converted: {value}";
+ public object ConvertBack(object? value, Type targetType, object parameter, string language) => Regex.Replace(value?.ToString() ?? string.Empty, "(Converted: )", string.Empty);
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/Strings/en/Resources.resw b/samples/MauiEmbedding/MauiEmbedding/Strings/en/Resources.resw
new file mode 100644
index 0000000000..89cb62d377
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Strings/en/Resources.resw
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ MauiEmbedding-en
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Strings/es/Resources.resw b/samples/MauiEmbedding/MauiEmbedding/Strings/es/Resources.resw
new file mode 100644
index 0000000000..bedc623cb0
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Strings/es/Resources.resw
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ MauiEmbedding-es
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Strings/fr/Resources.resw b/samples/MauiEmbedding/MauiEmbedding/Strings/fr/Resources.resw
new file mode 100644
index 0000000000..28656c4897
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Strings/fr/Resources.resw
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ MauiEmbedding-fr
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Strings/pt-BR/Resources.resw b/samples/MauiEmbedding/MauiEmbedding/Strings/pt-BR/Resources.resw
new file mode 100644
index 0000000000..4da1f2622e
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Strings/pt-BR/Resources.resw
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ MauiEmbedding-pt-BR
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/Styles/ColorPaletteOverride.xaml b/samples/MauiEmbedding/MauiEmbedding/Styles/ColorPaletteOverride.xaml
new file mode 100644
index 0000000000..2710b29121
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Styles/ColorPaletteOverride.xaml
@@ -0,0 +1,65 @@
+
+
+
+
+ #5946D2
+ #FFFFFF
+ #E5DEFF
+ #170065
+ #6B4EA2
+ #FFFFFF
+ #EBDDFF
+ #1F182B
+ #0061A4
+ #FFFFFF
+ #CFE4FF
+ #001D36
+ #B3261E
+ #F9DEDC
+ #FFFFFF
+ #410E0B
+ #FCFBFF
+ #1C1B1F
+ #FFFFFF
+ #1C1B1F
+ #F3EFF5
+ #8B8494
+ #79747E
+ #F4EFF4
+ #313033
+ #C8BFFF
+ #5946D2
+ #C9C5D0
+
+
+ #C7BFFF
+ #2A009F
+ #4129BA
+ #E4DFFF
+ #CDC2DC
+ #332D41
+ #433C52
+ #EBDDFF
+ #9FCAFF
+ #003258
+ #00497E
+ #D1E4FF
+ #FFB4AB
+ #93000A
+ #690005
+ #FFDAD6
+ #1C1B1F
+ #E5E1E6
+ #302D38
+ #E6E1E5
+ #47464F
+ #C9C5D0
+ #928F99
+ #1C1B1F
+ #E6E1E5
+ #2A009F
+ #544794
+ #57545D
+
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiEmbedding/Styles/ColorPaletteOverride.zip b/samples/MauiEmbedding/MauiEmbedding/Styles/ColorPaletteOverride.zip
new file mode 100644
index 0000000000..6bafe9c70d
Binary files /dev/null and b/samples/MauiEmbedding/MauiEmbedding/Styles/ColorPaletteOverride.zip differ
diff --git a/samples/MauiEmbedding/MauiEmbedding/Styles/MaterialFontsOverride.xaml b/samples/MauiEmbedding/MauiEmbedding/Styles/MaterialFontsOverride.xaml
new file mode 100644
index 0000000000..385d659538
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/Styles/MaterialFontsOverride.xaml
@@ -0,0 +1,8 @@
+
+
+ ms-appx:///Uno.Fonts.Roboto/Fonts/Roboto-Light.ttf#Roboto
+ ms-appx:///Uno.Fonts.Roboto/Fonts/Roboto-Medium.ttf#Roboto
+ ms-appx:///Uno.Fonts.Roboto/Fonts/Roboto-Regular.ttf#Roboto
+
+
diff --git a/samples/MauiEmbedding/MauiEmbedding/appsettings.development.json b/samples/MauiEmbedding/MauiEmbedding/appsettings.development.json
new file mode 100644
index 0000000000..31a70b7220
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/appsettings.development.json
@@ -0,0 +1,5 @@
+{
+ "AppConfig": {
+ "Environment": "Development"
+ }
+}
diff --git a/samples/MauiEmbedding/MauiEmbedding/appsettings.json b/samples/MauiEmbedding/MauiEmbedding/appsettings.json
new file mode 100644
index 0000000000..187e4d5cfc
--- /dev/null
+++ b/samples/MauiEmbedding/MauiEmbedding/appsettings.json
@@ -0,0 +1,13 @@
+{
+ "AppConfig": {
+ "Environment": "Production"
+ },
+ "LocalizationConfiguration": {
+ "Cultures": [
+ "es",
+ "fr",
+ "pt-BR",
+ "en"
+ ]
+ }
+}
diff --git a/samples/MauiEmbedding/MauiProjects/Directory.Build.props b/samples/MauiEmbedding/MauiProjects/Directory.Build.props
new file mode 100644
index 0000000000..59ee9ce44e
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/Directory.Build.props
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/Directory.Build.targets b/samples/MauiEmbedding/MauiProjects/Directory.Build.targets
new file mode 100644
index 0000000000..4230916164
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/Directory.Build.targets
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/Directory.Packages.props b/samples/MauiEmbedding/MauiProjects/Directory.Packages.props
new file mode 100644
index 0000000000..17999977b6
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/Directory.Packages.props
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/App.xaml b/samples/MauiEmbedding/MauiProjects/MauiApp1/App.xaml
new file mode 100644
index 0000000000..8fb5f38c68
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/App.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/App.xaml.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/App.xaml.cs
new file mode 100644
index 0000000000..dfe78276f5
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/App.xaml.cs
@@ -0,0 +1,11 @@
+namespace MauiApp1;
+
+public partial class App : Application
+{
+ public App()
+ {
+ InitializeComponent();
+
+ MainPage = new AppShell();
+ }
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/AppShell.xaml b/samples/MauiEmbedding/MauiProjects/MauiApp1/AppShell.xaml
new file mode 100644
index 0000000000..b1bb675987
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/AppShell.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/AppShell.xaml.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/AppShell.xaml.cs
new file mode 100644
index 0000000000..831b83ba1f
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/AppShell.xaml.cs
@@ -0,0 +1,9 @@
+namespace MauiApp1;
+
+public partial class AppShell : Shell
+{
+ public AppShell()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/MainPage.xaml b/samples/MauiEmbedding/MauiProjects/MauiApp1/MainPage.xaml
new file mode 100644
index 0000000000..f9657596c0
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/MainPage.xaml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/MainPage.xaml.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/MainPage.xaml.cs
new file mode 100644
index 0000000000..3bfd810157
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/MainPage.xaml.cs
@@ -0,0 +1,71 @@
+using Esri.ArcGISRuntime.Mapping;
+using Esri.ArcGISRuntime.Mapping.Floor;
+using Map = Esri.ArcGISRuntime.Mapping.Map;
+
+namespace MauiApp1;
+
+public partial class MainPage : ContentPage
+{
+ private FloorManager _floorManager;
+ int count = 0;
+ // Collection of floors.
+ private readonly Dictionary _floorOptions = new Dictionary();
+ public MainPage()
+ {
+ InitializeComponent();
+
+ _ = Initialize();
+ }
+
+
+ private async Task Initialize()
+ {
+ try
+ {
+ // Gets the floor data from ArcGIS Online and creates a map with it.
+ Map map = new Map(new Uri("https://ess.maps.arcgis.com/home/item.html?id=f133a698536f44c8884ad81f80b6cfc7"));
+
+ mapView.Map = map;
+
+ // Map needs to be loaded in order for floormanager to be used.
+ await mapView.Map.LoadAsync();
+ List floorName = new List();
+
+ // Checks to see if the layer is floor aware.
+ if (mapView.Map.FloorDefinition == null)
+ {
+ await Application.Current.MainPage.DisplayAlert("Alert", "The layer is not floor aware.", "OK");
+ return;
+ }
+
+ await mapView.Map.FloorManager.LoadAsync();
+ _floorManager = mapView.Map.FloorManager;
+
+ // Use the dictionary to add the level's name as the key and the FloorLevel object with the associated level's name.
+ foreach (FloorLevel level in _floorManager.Facilities[0].Levels)
+ {
+ _floorOptions.Add(level.ShortName, level);
+ floorName.Add(level.ShortName);
+ }
+
+ //FloorChooser.ItemsSource = floorName;
+ }
+ catch (Exception ex)
+ {
+ await Application.Current.MainPage.DisplayAlert("Alert", ex.Message, "OK");
+ }
+ }
+
+ private void OnCounterClicked(object sender, EventArgs e)
+ {
+ count++;
+
+ if (count == 1)
+ CounterBtn.Text = $"Clicked {count} time";
+ else
+ CounterBtn.Text = $"Clicked {count} times";
+
+ SemanticScreenReader.Announce(CounterBtn.Text);
+ }
+}
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/MauiApp1.csproj b/samples/MauiEmbedding/MauiProjects/MauiApp1/MauiApp1.csproj
new file mode 100644
index 0000000000..f29c2d6429
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/MauiApp1.csproj
@@ -0,0 +1,61 @@
+
+
+
+ net7.0-android;net7.0-ios;net7.0-maccatalyst
+ $(TargetFrameworks);net7.0-windows10.0.19041.0
+
+
+ Exe
+ MauiApp1
+ true
+ true
+ enable
+
+
+ MauiApp1
+
+
+ com.companyname.mauiapp1
+ 8fe00b33-ae37-4cf2-aa44-cc7f21a61722
+
+
+ 1.0
+ 1
+
+ 11.0
+ 13.1
+ 21.0
+ 10.0.17763.0
+ 10.0.17763.0
+ 6.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/MauiProgram.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/MauiProgram.cs
new file mode 100644
index 0000000000..e6249b7d24
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/MauiProgram.cs
@@ -0,0 +1,31 @@
+using Microsoft.Extensions.Logging;
+using MauiControlsExternal;
+//using Telerik.Maui.Controls;
+// using Telerik.Maui.Controls.Compatibility;
+using Esri.ArcGISRuntime.Maui;
+
+namespace MauiApp1;
+public static class MauiProgram
+{
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ //.UseTelerik()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ })
+ .UseCustomLibrary()
+ //.UseTelerikControls()
+ .UseArcGISRuntime();
+
+#if DEBUG
+ //builder.Logging.AddDebug();
+#endif
+
+ return builder.Build();
+ }
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/AndroidManifest.xml b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 0000000000..e9937ad77d
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/MainActivity.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/MainActivity.cs
new file mode 100644
index 0000000000..cb6049dc5d
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/MainActivity.cs
@@ -0,0 +1,9 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+
+namespace MauiApp1;
+[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
+public class MainActivity : MauiAppCompatActivity
+{
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/MainApplication.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/MainApplication.cs
new file mode 100644
index 0000000000..dc8fe53efd
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/MainApplication.cs
@@ -0,0 +1,14 @@
+using Android.App;
+using Android.Runtime;
+
+namespace MauiApp1;
+[Application]
+public class MainApplication : MauiApplication
+{
+ public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+ : base(handle, ownership)
+ {
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/Resources/values/colors.xml b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 0000000000..c04d7492ab
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #512BD4
+ #2B0B98
+ #2B0B98
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/MacCatalyst/AppDelegate.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/MacCatalyst/AppDelegate.cs
new file mode 100644
index 0000000000..c66ca33367
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/MacCatalyst/AppDelegate.cs
@@ -0,0 +1,8 @@
+using Foundation;
+
+namespace MauiApp1;
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/MacCatalyst/Info.plist b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/MacCatalyst/Info.plist
new file mode 100644
index 0000000000..c96dd0a225
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/MacCatalyst/Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/MacCatalyst/Program.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/MacCatalyst/Program.cs
new file mode 100644
index 0000000000..7a734ca134
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/MacCatalyst/Program.cs
@@ -0,0 +1,14 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace MauiApp1;
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Tizen/Main.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Tizen/Main.cs
new file mode 100644
index 0000000000..f2c3bc7379
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Tizen/Main.cs
@@ -0,0 +1,16 @@
+using System;
+using Microsoft.Maui;
+using Microsoft.Maui.Hosting;
+
+namespace MauiApp1;
+
+internal class Program : MauiApplication
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+
+ static void Main(string[] args)
+ {
+ var app = new Program();
+ app.Run(args);
+ }
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Tizen/tizen-manifest.xml b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Tizen/tizen-manifest.xml
new file mode 100644
index 0000000000..eda2ec7edf
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Tizen/tizen-manifest.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ maui-appicon-placeholder
+
+
+
+
+ http://tizen.org/privilege/internet
+
+
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/App.xaml b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/App.xaml
new file mode 100644
index 0000000000..4cf22441af
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/App.xaml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/App.xaml.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/App.xaml.cs
new file mode 100644
index 0000000000..e682d4714f
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/App.xaml.cs
@@ -0,0 +1,23 @@
+using Microsoft.UI.Xaml;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace MauiApp1.WinUI;
+///
+/// Provides application-specific behavior to supplement the default Application class.
+///
+public partial class App : MauiWinUIApplication
+{
+ ///
+ /// 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()
+ {
+ this.InitializeComponent();
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/Package.appxmanifest b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/Package.appxmanifest
new file mode 100644
index 0000000000..f09d5f00df
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/Package.appxmanifest
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+ $placeholder$
+ User Name
+ $placeholder$.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/app.manifest b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/app.manifest
new file mode 100644
index 0000000000..2da12c4ce0
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/Windows/app.manifest
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/iOS/AppDelegate.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/iOS/AppDelegate.cs
new file mode 100644
index 0000000000..c66ca33367
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/iOS/AppDelegate.cs
@@ -0,0 +1,8 @@
+using Foundation;
+
+namespace MauiApp1;
+[Register("AppDelegate")]
+public class AppDelegate : MauiUIApplicationDelegate
+{
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/iOS/Info.plist b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/iOS/Info.plist
new file mode 100644
index 0000000000..0004a4fdee
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/iOS/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/iOS/Program.cs b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/iOS/Program.cs
new file mode 100644
index 0000000000..7a734ca134
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Platforms/iOS/Program.cs
@@ -0,0 +1,14 @@
+using ObjCRuntime;
+using UIKit;
+
+namespace MauiApp1;
+public class Program
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/AppIcon/appicon.svg b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/AppIcon/appicon.svg
new file mode 100644
index 0000000000..9d63b6513a
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/AppIcon/appicon.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/AppIcon/appiconfg.svg b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/AppIcon/appiconfg.svg
new file mode 100644
index 0000000000..21dfb25f18
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/AppIcon/appiconfg.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Fonts/OpenSans-Regular.ttf b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000000..2c3020b077
Binary files /dev/null and b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Fonts/OpenSans-Regular.ttf differ
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Fonts/OpenSans-Semibold.ttf b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Fonts/OpenSans-Semibold.ttf
new file mode 100644
index 0000000000..3e7fe5305b
Binary files /dev/null and b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Fonts/OpenSans-Semibold.ttf differ
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Images/dotnet_bot.svg b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Images/dotnet_bot.svg
new file mode 100644
index 0000000000..abfaff26a8
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Images/dotnet_bot.svg
@@ -0,0 +1,93 @@
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Raw/AboutAssets.txt b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Raw/AboutAssets.txt
new file mode 100644
index 0000000000..15d6244845
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Raw/AboutAssets.txt
@@ -0,0 +1,15 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories). Deployment of the asset to your application
+is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
+
+
+
+These files will be deployed with you package and will be accessible using Essentials:
+
+ async Task LoadMauiAsset()
+ {
+ using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
+ using var reader = new StreamReader(stream);
+
+ var contents = reader.ReadToEnd();
+ }
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Splash/splash.svg b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Splash/splash.svg
new file mode 100644
index 0000000000..21dfb25f18
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Splash/splash.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Styles/Colors.xaml b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Styles/Colors.xaml
new file mode 100644
index 0000000000..245758ba17
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Styles/Colors.xaml
@@ -0,0 +1,44 @@
+
+
+
+
+ #512BD4
+ #DFD8F7
+ #2B0B98
+ White
+ Black
+ #E1E1E1
+ #C8C8C8
+ #ACACAC
+ #919191
+ #6E6E6E
+ #404040
+ #212121
+ #141414
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #F7B548
+ #FFD590
+ #FFE5B9
+ #28C2D1
+ #7BDDEF
+ #C3F2F4
+ #3E8EED
+ #72ACF1
+ #A7CBF6
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Styles/Styles.xaml b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Styles/Styles.xaml
new file mode 100644
index 0000000000..dc4a03475b
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiApp1/Resources/Styles/Styles.xaml
@@ -0,0 +1,405 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/MauiControlsExternal/AppBuildExtensions.cs b/samples/MauiEmbedding/MauiProjects/MauiControlsExternal/AppBuildExtensions.cs
new file mode 100644
index 0000000000..561b6d0fc0
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiControlsExternal/AppBuildExtensions.cs
@@ -0,0 +1,10 @@
+namespace MauiControlsExternal;
+public static class AppBuildExtensions
+{
+ public static MauiAppBuilder UseCustomLibrary(this MauiAppBuilder builder)
+ {
+ CustomEntry.Init();
+
+ return builder;
+ }
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiControlsExternal/CustomEntry.cs b/samples/MauiEmbedding/MauiProjects/MauiControlsExternal/CustomEntry.cs
new file mode 100644
index 0000000000..fa09ded511
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiControlsExternal/CustomEntry.cs
@@ -0,0 +1,55 @@
+using Microsoft.Maui.Handlers;
+using Microsoft.Maui.Platform;
+
+namespace MauiControlsExternal;
+
+// All the code in this file is included in all platforms.
+public class CustomEntry : Entry
+{
+ public static readonly BindableProperty BorderColorProperty = BindableProperty.Create(
+ nameof(BorderColor), typeof(Color), typeof(CustomEntry), null);
+
+ public Color BorderColor
+ {
+ get => (Color)GetValue(BorderColorProperty);
+ set => SetValue(BorderColorProperty, value);
+ }
+
+ internal static void Init()
+ {
+ EntryHandler.Mapper.AppendToMapping(nameof(BorderColor), (h, v) =>
+ {
+ if (v is not CustomEntry entry)
+ {
+ return;
+ }
+
+#if IOS
+ if (h.PlatformView is UIKit.UITextField textField)
+ {
+ var color = entry.BorderColor?.ToPlatform().CGColor ?? UIKit.UIColor.Black.CGColor;
+ textField.Layer.BorderColor = color;
+ textField.Layer.BorderWidth = 1;
+ }
+
+#elif ANDROID
+
+ if (h.PlatformView is AndroidX.AppCompat.Widget.AppCompatEditText editText)
+ {
+ var color = entry.BorderColor?.ToPlatform() ?? Android.Graphics.Color.Black;
+ var shape = new Android.Graphics.Drawables.ShapeDrawable(new Android.Graphics.Drawables.Shapes.RectShape());
+ shape.Paint.Color = color;
+ shape.Paint.SetStyle(Android.Graphics.Paint.Style.Stroke);
+ editText.Background = shape;
+ }
+#elif WINDOWS
+ if (h.PlatformView is Microsoft.UI.Xaml.Controls.TextBox textBox)
+ {
+ var color = entry.BorderColor.ToPlatform() ?? Colors.Black.ToPlatform();
+ textBox.BorderBrush = color;
+ textBox.BorderThickness = new Microsoft.UI.Xaml.Thickness(1);
+ }
+#endif
+ });
+ }
+}
diff --git a/samples/MauiEmbedding/MauiProjects/MauiControlsExternal/MauiControlsExternal.csproj b/samples/MauiEmbedding/MauiProjects/MauiControlsExternal/MauiControlsExternal.csproj
new file mode 100644
index 0000000000..a53581753f
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/MauiControlsExternal/MauiControlsExternal.csproj
@@ -0,0 +1,17 @@
+
+
+
+ net7.0;net7.0-android;net7.0-ios;net7.0-maccatalyst
+ $(TargetFrameworks);net7.0-windows10.0.19041.0
+ true
+ true
+ enable
+
+ 14.2
+ 14.0
+ 21.0
+ 10.0.17763.0
+ 10.0.17763.0
+ 6.5
+
+
diff --git a/samples/MauiEmbedding/MauiProjects/New folder/Directory.Build.props b/samples/MauiEmbedding/MauiProjects/New folder/Directory.Build.props
new file mode 100644
index 0000000000..59ee9ce44e
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/New folder/Directory.Build.props
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/MauiProjects/New folder/Directory.Build.targets b/samples/MauiEmbedding/MauiProjects/New folder/Directory.Build.targets
new file mode 100644
index 0000000000..4230916164
--- /dev/null
+++ b/samples/MauiEmbedding/MauiProjects/New folder/Directory.Build.targets
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/samples/MauiEmbedding/global.json b/samples/MauiEmbedding/global.json
new file mode 100644
index 0000000000..0385fde5c2
--- /dev/null
+++ b/samples/MauiEmbedding/global.json
@@ -0,0 +1,5 @@
+{
+ "msbuild-sdks": {
+ "MSBuild.Sdk.Extras": "3.0.44"
+ }
+}
diff --git a/samples/Playground/Directory.Packages.props b/samples/Playground/Directory.Packages.props
index b4ca6006f7..05e0097f2e 100644
--- a/samples/Playground/Directory.Packages.props
+++ b/samples/Playground/Directory.Packages.props
@@ -29,16 +29,16 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
diff --git a/samples/Playground/Playground.sln b/samples/Playground/Playground.sln
index 5f31dabe9a..5dea9f434a 100644
--- a/samples/Playground/Playground.sln
+++ b/samples/Playground/Playground.sln
@@ -3088,6 +3088,8 @@ Global
SolutionGuid = {1A645832-60E5-4DA0-9EE7-69F7E34333DC}
EndGlobalSection
GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ Playground.Shared\Playground.Shared.projitems*{0be93281-9633-484a-9a2f-f3b7bd36a443}*SharedItemsImports = 5
+ Playground.Shared\Playground.Shared.projitems*{0c7a4b61-d7c6-48f8-83b6-d7cfa896b8c9}*SharedItemsImports = 5
Playground.Shared\Playground.Shared.projitems*{1efb7b93-88d1-4f14-b335-bab42a49faf0}*SharedItemsImports = 5
Playground.Shared\Playground.Shared.projitems*{6279c845-92f8-4333-ab99-3d213163593c}*SharedItemsImports = 13
Playground.Shared\Playground.Shared.projitems*{7034cdec-7056-4e65-a043-a380582cfbd0}*SharedItemsImports = 5
diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index 817ba4376b..3abe3f9b93 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -8,12 +8,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -21,7 +21,8 @@
-
+
+
@@ -44,15 +45,15 @@
-
-
-
-
+
+
+
+
-
+
-
-
+
+
diff --git a/src/Uno.Extensions-packageonly.slnf b/src/Uno.Extensions-packageonly.slnf
index ab39b90822..a36885afb2 100644
--- a/src/Uno.Extensions-packageonly.slnf
+++ b/src/Uno.Extensions-packageonly.slnf
@@ -23,7 +23,6 @@
"Uno.Extensions.Hosting.UI\\Uno.Extensions.Hosting.WinUI.Wasm.csproj",
"Uno.Extensions.Hosting.UI\\Uno.Extensions.Hosting.WinUI.csproj",
"Uno.Extensions.Hosting\\Uno.Extensions.Hosting.csproj",
- "Uno.Extensions.Http.Interfaces\\Uno.Extensions.Http.Interfaces.csproj",
"Uno.Extensions.Http.Refit\\Uno.Extensions.Http.Refit.csproj",
"Uno.Extensions.Http.UI\\Uno.Extensions.Http.UI.csproj",
"Uno.Extensions.Http.UI\\Uno.Extensions.Http.WinUI.csproj",
@@ -38,6 +37,7 @@
"Uno.Extensions.Logging\\Uno.Extensions.Logging.WinUI.Skia.csproj",
"Uno.Extensions.Logging\\Uno.Extensions.Logging.WinUI.Wasm.csproj",
"Uno.Extensions.Logging\\Uno.Extensions.Logging.WinUI.csproj",
+ "Uno.Extensions.Maui.UI\\Uno.Extensions.Maui.WinUI.csproj",
"Uno.Extensions.Navigation.Generators\\Uno.Extensions.Navigation.Generators.csproj",
"Uno.Extensions.Navigation.Toolkit\\Uno.Extensions.Navigation.Toolkit.UI.csproj",
"Uno.Extensions.Navigation.Toolkit\\Uno.Extensions.Navigation.Toolkit.WinUI.csproj",
@@ -61,8 +61,7 @@
"Uno.Extensions.Toolkit.UI\\Uno.Extensions.Toolkit.WinUI.csproj",
"Uno.Extensions.Toolkit\\Uno.Extensions.Toolkit.csproj",
"Uno.Extensions.Validation.Fluent\\Uno.Extensions.Validation.Fluent.csproj",
- "Uno.Extensions.Validation\\Uno.Extensions.Validation.csproj",
- "Uno.Extensions\\Uno.Extensions.csproj"
+ "Uno.Extensions.Validation\\Uno.Extensions.Validation.csproj"
]
}
}
\ No newline at end of file
diff --git a/src/Uno.Extensions.Authentication.MSAL/Uno.Extensions.Authentication.MSAL.WinUI.csproj b/src/Uno.Extensions.Authentication.MSAL/Uno.Extensions.Authentication.MSAL.WinUI.csproj
index 51331b14a5..6d499eb762 100644
--- a/src/Uno.Extensions.Authentication.MSAL/Uno.Extensions.Authentication.MSAL.WinUI.csproj
+++ b/src/Uno.Extensions.Authentication.MSAL/Uno.Extensions.Authentication.MSAL.WinUI.csproj
@@ -48,7 +48,7 @@
15.4
-
+
diff --git a/src/Uno.Extensions.Authentication.Oidc/Uno.Extensions.Authentication.Oidc.WinUI.csproj b/src/Uno.Extensions.Authentication.Oidc/Uno.Extensions.Authentication.Oidc.WinUI.csproj
index 9aee5025ba..c31d289932 100644
--- a/src/Uno.Extensions.Authentication.Oidc/Uno.Extensions.Authentication.Oidc.WinUI.csproj
+++ b/src/Uno.Extensions.Authentication.Oidc/Uno.Extensions.Authentication.Oidc.WinUI.csproj
@@ -15,7 +15,7 @@
$(DefineConstants);WINUI
-
+
diff --git a/src/Uno.Extensions.Authentication.UI/Uno.Extensions.Authentication.WinUI.csproj b/src/Uno.Extensions.Authentication.UI/Uno.Extensions.Authentication.WinUI.csproj
index 85cf98afdf..cb9e506a37 100644
--- a/src/Uno.Extensions.Authentication.UI/Uno.Extensions.Authentication.WinUI.csproj
+++ b/src/Uno.Extensions.Authentication.UI/Uno.Extensions.Authentication.WinUI.csproj
@@ -13,7 +13,7 @@
$(DefineConstants);WINUI
-
+
diff --git a/src/Uno.Extensions.Core.UI/Uno.Extensions.Core.WinUI.csproj b/src/Uno.Extensions.Core.UI/Uno.Extensions.Core.WinUI.csproj
index ebb8887f9e..899b89a690 100644
--- a/src/Uno.Extensions.Core.UI/Uno.Extensions.Core.WinUI.csproj
+++ b/src/Uno.Extensions.Core.UI/Uno.Extensions.Core.WinUI.csproj
@@ -12,7 +12,7 @@
$(DefineConstants);WINUI
-
+
\ No newline at end of file
diff --git a/src/Uno.Extensions.Hosting.UI/Uno.Extensions.Hosting.WinUI.Skia.csproj b/src/Uno.Extensions.Hosting.UI/Uno.Extensions.Hosting.WinUI.Skia.csproj
index 0a96e162f0..1ae52688b2 100644
--- a/src/Uno.Extensions.Hosting.UI/Uno.Extensions.Hosting.WinUI.Skia.csproj
+++ b/src/Uno.Extensions.Hosting.UI/Uno.Extensions.Hosting.WinUI.Skia.csproj
@@ -14,7 +14,7 @@
-
+
diff --git a/src/Uno.Extensions.Hosting.UI/Uno.Extensions.Hosting.WinUI.csproj b/src/Uno.Extensions.Hosting.UI/Uno.Extensions.Hosting.WinUI.csproj
index 563afee6fe..3af9ef9828 100644
--- a/src/Uno.Extensions.Hosting.UI/Uno.Extensions.Hosting.WinUI.csproj
+++ b/src/Uno.Extensions.Hosting.UI/Uno.Extensions.Hosting.WinUI.csproj
@@ -17,7 +17,7 @@
$(DefineConstants);WINUI
-
+
diff --git a/src/Uno.Extensions.Http.UI/Uno.Extensions.Http.WinUI.csproj b/src/Uno.Extensions.Http.UI/Uno.Extensions.Http.WinUI.csproj
index 114abb06a1..035b548fb3 100644
--- a/src/Uno.Extensions.Http.UI/Uno.Extensions.Http.WinUI.csproj
+++ b/src/Uno.Extensions.Http.UI/Uno.Extensions.Http.WinUI.csproj
@@ -7,7 +7,7 @@
$(DefineConstants);WINUI
-
+
diff --git a/src/Uno.Extensions.Localization.UI/Uno.Extensions.Localization.WinUI.csproj b/src/Uno.Extensions.Localization.UI/Uno.Extensions.Localization.WinUI.csproj
index aceed8f9ef..52173b24b2 100644
--- a/src/Uno.Extensions.Localization.UI/Uno.Extensions.Localization.WinUI.csproj
+++ b/src/Uno.Extensions.Localization.UI/Uno.Extensions.Localization.WinUI.csproj
@@ -11,7 +11,7 @@
$(DefineConstants);WINUI
-
+
diff --git a/src/Uno.Extensions.Logging/Uno.Extensions.Logging.WinUI.Skia.csproj b/src/Uno.Extensions.Logging/Uno.Extensions.Logging.WinUI.Skia.csproj
index 8bcc4e9edb..60c3a6edba 100644
--- a/src/Uno.Extensions.Logging/Uno.Extensions.Logging.WinUI.Skia.csproj
+++ b/src/Uno.Extensions.Logging/Uno.Extensions.Logging.WinUI.Skia.csproj
@@ -10,7 +10,7 @@
net7.0
-
+
diff --git a/src/Uno.Extensions.Logging/Uno.Extensions.Logging.WinUI.csproj b/src/Uno.Extensions.Logging/Uno.Extensions.Logging.WinUI.csproj
index 1de3d3858f..77ba529c9f 100644
--- a/src/Uno.Extensions.Logging/Uno.Extensions.Logging.WinUI.csproj
+++ b/src/Uno.Extensions.Logging/Uno.Extensions.Logging.WinUI.csproj
@@ -22,7 +22,7 @@
-
+
diff --git a/src/Uno.Extensions.Maui.UI/GlobalUsings.cs b/src/Uno.Extensions.Maui.UI/GlobalUsings.cs
new file mode 100644
index 0000000000..5774ecb9de
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/GlobalUsings.cs
@@ -0,0 +1,29 @@
+global using System;
+global using System.Collections.Generic;
+global using System.Linq;
+global using System.Text;
+global using System.Threading.Tasks;
+global using Microsoft.Extensions.DependencyInjection;
+global using Microsoft.Extensions.Logging;
+global using Microsoft.Maui.Embedding;
+global using Microsoft.Maui.Platform;
+global using Microsoft.UI.Xaml;
+global using Microsoft.UI.Xaml.Controls;
+global using Microsoft.UI.Xaml.Markup;
+global using Uno.Extensions.Maui.Properties;
+global using Application = Microsoft.UI.Xaml.Application;
+global using MauiApplication = Microsoft.Maui.Controls.Application;
+global using Binding = Microsoft.Maui.Controls.Binding;
+global using BindingMode = Microsoft.Maui.Controls.BindingMode;
+global using View = Microsoft.Maui.Controls.View;
+global using MauiApp = Microsoft.Maui.Hosting.MauiApp;
+global using MauiAppBuilder = Microsoft.Maui.Hosting.MauiAppBuilder;
+global using IMauiContext = Microsoft.Maui.IMauiContext;
+global using MauiContext = Microsoft.Maui.MauiContext;
+global using NativeMauiBinding = Microsoft.Maui.Controls.Binding;
+global using WinUIColor = Windows.UI.Color;
+global using NativeMauiColor = Microsoft.Maui.Graphics.Color;
+global using MauiResourceDictionary = Microsoft.Maui.Controls.ResourceDictionary;
+global using IMauiConverter = Microsoft.Maui.Controls.IValueConverter;
+global using IWinUIConverter = Microsoft.UI.Xaml.Data.IValueConverter;
+global using Uno.Extensions.Maui.Models;
diff --git a/src/Uno.Extensions.Maui.UI/Internals/ConversionExtensions.cs b/src/Uno.Extensions.Maui.UI/Internals/ConversionExtensions.cs
new file mode 100644
index 0000000000..64548fcf20
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Internals/ConversionExtensions.cs
@@ -0,0 +1,63 @@
+namespace Uno.Extensions.Maui.Internals;
+
+internal static class ConversionExtensions
+{
+ public static Microsoft.Maui.Controls.ResourceDictionary ToMauiResources(this ResourceDictionary input)
+ {
+ var output = new Microsoft.Maui.Controls.ResourceDictionary();
+ foreach (var merged in input.MergedDictionaries)
+ {
+ output.MergedDictionaries.Add(merged.ToMauiResources());
+ }
+
+ try
+ {
+ if (input.ThemeDictionaries.Any())
+ {
+ input = input.ThemeDictionaries.TryGetValue("Default", out var dict) ?
+ (dict as ResourceDictionary)! :
+ (input.ThemeDictionaries.First().Value as ResourceDictionary)!;
+ }
+
+ foreach (var kvp in input)
+ {
+ try
+ {
+ if (input.MergedDictionaries.Any(x => x.ContainsKey(kvp.Key)))
+ {
+ continue;
+ }
+
+ TryAddValue(ref output, kvp.Key, kvp.Value);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine($"Failed to convert resource {kvp.Key} with value {kvp.Value} to Maui: {e}");
+ }
+ }
+ }
+ catch { } // TODO: Work out how to handle exceptions being raised when accessing dictionary with themeresources
+
+ return output;
+ }
+
+ private static void TryAddValue(ref Microsoft.Maui.Controls.ResourceDictionary resources, object sourceKey, object value)
+ {
+ // NOTE: Interop was part of the POC and is out of scope for the MVP
+ // if (value is Style winUIStyle)
+ // {
+ // // This needs to be nested to prevent further processing if we cannot generate a Maui Style
+ // if(Interop.MauiInterop.TryGetStyle(winUIStyle, out var style) && style != null)
+ // {
+ // var key = sourceKey is string str ? str : style.TargetType.FullName;
+ // resources[key] = style;
+ // }
+ // }
+ // else
+ if (sourceKey is string key && !string.IsNullOrEmpty(key) && !resources.ContainsKey(key))
+ {
+ var mauiValue = ConversionHelpers.ToMauiValue(value);
+ resources[key] = mauiValue ?? value;
+ }
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Internals/ConversionHelpers.cs b/src/Uno.Extensions.Maui.UI/Internals/ConversionHelpers.cs
new file mode 100644
index 0000000000..5739f7782c
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Internals/ConversionHelpers.cs
@@ -0,0 +1,57 @@
+using System.Globalization;
+using Microsoft.UI.Xaml.Media;
+using LayoutOptions = Microsoft.Maui.Controls.LayoutOptions;
+using Thickness = Microsoft.UI.Xaml.Thickness;
+
+namespace Uno.Extensions.Maui.Internals;
+
+internal static class ConversionHelpers
+{
+ internal static object? ToMauiValue(object input)
+ {
+ return input switch
+ {
+ int valueAsInt => valueAsInt,
+ double valueAsDouble => valueAsDouble,
+ float valueAsFloat => valueAsFloat,
+ IWinUIConverter converter => new UnoHostConverter(converter),
+ SolidColorBrush solidColorBrush => new Microsoft.Maui.Controls.SolidColorBrush(new NativeMauiColor(solidColorBrush.Color.R, solidColorBrush.Color.G, solidColorBrush.Color.B, solidColorBrush.Color.A)),
+ WinUIColor color => new NativeMauiColor(color.R, color.G, color.B, color.A),
+ Thickness thickness => new Microsoft.Maui.Thickness(thickness.Left, thickness.Top, thickness.Right, thickness.Bottom),
+ HorizontalAlignment horizontalAlignment => GetLayoutOptions(horizontalAlignment),
+ VerticalAlignment verticalAlignment => GetLayoutOptions(verticalAlignment),
+ _ => null
+ };
+ }
+
+ private static LayoutOptions GetLayoutOptions(HorizontalAlignment alignment) =>
+ alignment switch
+ {
+ HorizontalAlignment.Center => LayoutOptions.Center,
+ HorizontalAlignment.Right => LayoutOptions.End,
+ HorizontalAlignment.Left => LayoutOptions.Start,
+ _ => LayoutOptions.Fill
+ };
+
+ private static LayoutOptions GetLayoutOptions(VerticalAlignment alignment) =>
+ alignment switch
+ {
+ VerticalAlignment.Center => LayoutOptions.Center,
+ VerticalAlignment.Bottom => LayoutOptions.End,
+ VerticalAlignment.Top => LayoutOptions.Start,
+ _ => LayoutOptions.Fill
+ };
+
+ private class UnoHostConverter : IMauiConverter
+ {
+ private IWinUIConverter _converter { get; }
+
+ public UnoHostConverter(IWinUIConverter converter) => _converter = converter;
+
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
+ _converter.Convert(value, targetType, parameter, culture.Name);
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
+ _converter.ConvertBack(value, targetType, parameter, culture.Name);
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Internals/ThreadHelper.cs b/src/Uno.Extensions.Maui.UI/Internals/ThreadHelper.cs
new file mode 100644
index 0000000000..a5f2725b6e
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Internals/ThreadHelper.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using System.Threading;
+
+namespace UnoMusicApp.Helpers
+{
+ ///
+ ///
+ ///
+ public static class ThreadHelpers
+ {
+ static bool IsMainThread => synchronizationContext == SynchronizationContext.Current;
+
+ internal static bool WhatThreadAmI([CallerMemberName] string method = "", [CallerLineNumber] int line = 0)
+ {
+ Debug.WriteLine("**************");
+ Debug.WriteLine("**************");
+ Debug.WriteLine($"{method}, line: {line}, IsMainThread: {IsMainThread}");
+ Debug.WriteLine("**************");
+ Debug.WriteLine("**************");
+ return IsMainThread;
+ }
+
+ static SynchronizationContext? synchronizationContext;
+
+ ///
+ ///
+ ///
+ ///
+ public static void Init(SynchronizationContext UiContext) => (synchronizationContext) = (UiContext);
+
+ internal static void BeginInvokeOnMainThread(Action action)
+ {
+ if (synchronizationContext is not null && SynchronizationContext.Current != synchronizationContext)
+ synchronizationContext.Post(_ => action(), null);
+ else
+ action();
+ }
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Internals/UnoHost.cs b/src/Uno.Extensions.Maui.UI/Internals/UnoHost.cs
new file mode 100644
index 0000000000..4632515ce4
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Internals/UnoHost.cs
@@ -0,0 +1,23 @@
+namespace Uno.Extensions.Maui.Internals;
+
+internal class UnoHost : Microsoft.Maui.Controls.VisualElement
+{
+ public UnoHost(ResourceDictionary resources)
+ {
+ Resources = resources.ToMauiResources();
+ }
+
+ protected override void OnBindingContextChanged()
+ {
+
+ if (BindingContext is null)
+ {
+ System.Console.WriteLine("UnoHost.BindingContext is null");
+ }
+ else
+ {
+ System.Console.WriteLine($"UnoHost.BindingContext is {BindingContext.GetType().FullName}");
+ }
+
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Internals/UnoMauiEmbeddingInitializer.cs b/src/Uno.Extensions.Maui.UI/Internals/UnoMauiEmbeddingInitializer.cs
new file mode 100644
index 0000000000..01d2c3d14e
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Internals/UnoMauiEmbeddingInitializer.cs
@@ -0,0 +1,43 @@
+using Microsoft.Maui.Hosting;
+
+namespace Uno.Extensions.Maui.Internals;
+
+internal class UnoMauiEmbeddingInitializer : IMauiInitializeService
+{
+ private readonly Application _app;
+
+ public UnoMauiEmbeddingInitializer(Application app)
+ {
+ _app = app;
+ }
+
+ public void Initialize(IServiceProvider services)
+ {
+ var resources = _app.Resources.ToMauiResources();
+ var iApp = services.GetRequiredService();
+ if (HasResources(resources) && iApp is MauiApplication mauiApp)
+ {
+ mauiApp.Resources.MergedDictionaries.Add(resources);
+ }
+ }
+
+ private static bool HasResources(MauiResourceDictionary resources)
+ {
+ if (resources.Keys.Any())
+ {
+ return true;
+ }
+ else if (resources.MergedDictionaries is not null && resources.MergedDictionaries.Any())
+ {
+ for (var i = 0; i < resources.MergedDictionaries.Count; i++)
+ {
+ if (HasResources(resources.MergedDictionaries.ElementAt(i)))
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Interop/IWinUIToMauiStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/IWinUIToMauiStyleHandler.cs
new file mode 100644
index 0000000000..419f04a9f2
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Interop/IWinUIToMauiStyleHandler.cs
@@ -0,0 +1,8 @@
+namespace Uno.Extensions.Maui.Interop;
+
+public interface IWinUIToMauiStyleHandler
+{
+ Type TargetType { get; }
+
+ MauiToWinUIStyleMapping? Process(DependencyProperty property, object value);
+}
diff --git a/src/Uno.Extensions.Maui.UI/Interop/LabelStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/LabelStyleHandler.cs
new file mode 100644
index 0000000000..6a268b6a62
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Interop/LabelStyleHandler.cs
@@ -0,0 +1,20 @@
+namespace Uno.Extensions.Maui.Interop;
+
+internal class LabelStyleHandler : WinUIToMauiStyleHandler
+{
+ public override Type TargetType => typeof(Microsoft.Maui.Controls.Label);
+
+ public override MauiToWinUIStyleMapping? Process(DependencyProperty property, object value)
+ {
+ if (property == Control.ForegroundProperty && TryConvertValue(value, out var converted) && converted is Microsoft.Maui.Controls.SolidColorBrush brush)
+ {
+ return new(Microsoft.Maui.Controls.Label.TextColorProperty, brush.Color);
+ }
+ else if (property == TextBlock.FontSizeProperty)
+ {
+ return new(Microsoft.Maui.Controls.Label.FontSizeProperty, ConvertToMauiValue(value));
+ }
+
+ return null;
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Interop/LayoutStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/LayoutStyleHandler.cs
new file mode 100644
index 0000000000..06055fdec8
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Interop/LayoutStyleHandler.cs
@@ -0,0 +1,13 @@
+namespace Uno.Extensions.Maui.Interop;
+
+internal class LayoutStyleHandler : WinUIToMauiStyleHandler
+{
+ public override Type TargetType => typeof(Microsoft.Maui.Controls.Layout);
+
+ public override MauiToWinUIStyleMapping? Process(DependencyProperty property, object value)
+ {
+ return property == Control.PaddingProperty
+ ? new(Microsoft.Maui.Controls.Layout.PaddingProperty, ConvertToMauiValue(value))
+ : null;
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Interop/MauiInterop.cs b/src/Uno.Extensions.Maui.UI/Interop/MauiInterop.cs
new file mode 100644
index 0000000000..6602641b97
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Interop/MauiInterop.cs
@@ -0,0 +1,81 @@
+namespace Uno.Extensions.Maui.Interop;
+
+internal static class MauiInterop
+{
+ private static readonly List _mappings = new();
+ private static readonly List _styleHandlers = new();
+
+ static MauiInterop()
+ {
+ MapControl();
+ MapControl();
+ MapControl();
+ MapControl();
+
+ MapStyleHandler();
+ MapStyleHandler();
+ MapStyleHandler();
+ MapStyleHandler();
+ }
+
+ public static void MapControl()
+ where TWinUI : FrameworkElement
+ where TMaui : Microsoft.Maui.Controls.View =>
+ _mappings.Add(new(typeof(TWinUI), typeof(TMaui)));
+
+ public static void MapStyleHandler()
+ where THandler : IWinUIToMauiStyleHandler, new() =>
+ _styleHandlers.Add(new THandler());
+
+ public static bool TryGetMapping(Type winUI, out Type? maui)
+ {
+ maui = _mappings.FirstOrDefault(x => x.WinUI == winUI)?.Maui;
+ return maui is not null;
+ }
+
+ public static bool TryGetStyle(Style winUIStyle, out Microsoft.Maui.Controls.Style? style)
+ {
+ style = null;
+
+ if (winUIStyle.TargetType is null
+ || !TryGetMapping(winUIStyle.TargetType, out var targetType)
+ || targetType is null
+ || (!winUIStyle.Setters.Any() && winUIStyle.BasedOn is null))
+ {
+ return false;
+ }
+
+ var tempStyle = new Microsoft.Maui.Controls.Style(targetType);
+ foreach (var setter in winUIStyle.Setters.OfType())
+ {
+ if (setter.Property is null || setter.Value is null)
+ {
+ continue;
+ }
+
+ var handlers = GetHandlers(targetType);
+
+
+ foreach (var handler in handlers)
+ {
+ var processed = handler.Process(setter.Property, setter.Value);
+ if (processed is null)
+ {
+ continue;
+ }
+
+ tempStyle.Setters.Add(new Microsoft.Maui.Controls.Setter { Property = processed.Property, Value = processed.Value });
+ }
+ }
+
+ style = tempStyle;
+
+ return style.Setters.Any() || style.BasedOn is not null;
+ }
+
+ private static List GetHandlers(Type targetType) =>
+ _styleHandlers.Where(x => x.TargetType == targetType
+ || x.TargetType.IsAssignableFrom(targetType)).ToList();
+
+ private record ControlMapping(Type WinUI, Type Maui);
+}
diff --git a/src/Uno.Extensions.Maui.UI/Interop/ViewStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/ViewStyleHandler.cs
new file mode 100644
index 0000000000..4cd8470339
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Interop/ViewStyleHandler.cs
@@ -0,0 +1,13 @@
+namespace Uno.Extensions.Maui.Interop;
+
+internal class ViewStyleHandler : WinUIToMauiStyleHandler
+{
+ public override Type TargetType => typeof(Microsoft.Maui.Controls.View);
+
+ public override MauiToWinUIStyleMapping? Process(DependencyProperty property, object value)
+ {
+ return property == Control.MarginProperty
+ ? new(Microsoft.Maui.Controls.View.MarginProperty, ConvertToMauiValue(value))
+ : null;
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Interop/VisualElementStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/VisualElementStyleHandler.cs
new file mode 100644
index 0000000000..576f86b292
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Interop/VisualElementStyleHandler.cs
@@ -0,0 +1,13 @@
+namespace Uno.Extensions.Maui.Interop;
+
+internal class VisualElementStyleHandler : WinUIToMauiStyleHandler
+{
+ public override Type TargetType => typeof(Microsoft.Maui.Controls.VisualElement);
+
+ public override MauiToWinUIStyleMapping? Process(DependencyProperty property, object value)
+ {
+ return property == Control.BackgroundProperty
+ ? new(Microsoft.Maui.Controls.VisualElement.BackgroundProperty, ConvertToMauiValue(value))
+ : null;
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Interop/WinUIToMauiStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/WinUIToMauiStyleHandler.cs
new file mode 100644
index 0000000000..f656a3eb5c
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Interop/WinUIToMauiStyleHandler.cs
@@ -0,0 +1,29 @@
+using Uno.Extensions.Maui.Internals;
+
+namespace Uno.Extensions.Maui.Interop;
+
+public abstract class WinUIToMauiStyleHandler : IWinUIToMauiStyleHandler
+{
+ public abstract Type TargetType { get; }
+
+ public abstract MauiToWinUIStyleMapping? Process(DependencyProperty property, object value);
+
+ protected virtual object? ConvertToMauiValue(object value)
+ {
+ return ConversionHelpers.ToMauiValue(value);
+ }
+
+ protected bool TryConvertValue(object value, out object? output)
+ {
+ try
+ {
+ output = ConvertToMauiValue(value);
+ return output != value;
+ }
+ catch
+ {
+ output = null;
+ return false;
+ }
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/MauiBinding.cs b/src/Uno.Extensions.Maui.UI/MauiBinding.cs
new file mode 100644
index 0000000000..562a521415
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/MauiBinding.cs
@@ -0,0 +1,75 @@
+using Uno.Extensions.Maui.Internals;
+using UnoMusicApp.Helpers;
+
+namespace Uno.Extensions.Maui;
+
+///
+/// A binding extension for Maui apps.
+///
+[ContentProperty(Name = nameof(Path))]
+public class MauiBinding : MauiExtensionBase
+{
+ ///
+ /// The path to the bound property.
+ ///
+ public string? Path { get; set; }
+
+ ///
+ /// The direction of the binding mode.
+ ///
+ public BindingMode BindingMode { get; set; } = BindingMode.Default;
+
+ ///
+ /// The string format of the bound property.
+ ///
+ public string? StringFormat { get; set; }
+
+ ///
+ /// The converter for the bound property.
+ ///
+ public object? Converter { get; set; }
+
+ ///
+ /// The parameter for the converter.
+ ///
+ public object? ConverterParameter { get; set; }
+
+ ///
+ /// The source object for the bound property.
+ ///
+ public object? Source { get; set; }
+
+ ///
+ protected override void SetValue(View view, Type viewType, Type propertyType, Microsoft.Maui.Controls.BindableProperty property, string propertyName)
+ {
+ if (string.IsNullOrEmpty(Path))
+ {
+ Path = ".";
+ }
+
+ ThreadHelpers.WhatThreadAmI();
+
+ IMauiConverter? converter = null;
+ if (Converter is IMauiConverter converterAsMauiConverter)
+ {
+ converter = converterAsMauiConverter;
+ }
+ else if (Converter is IWinUIConverter winUIConverter)
+ {
+ var value = ConversionHelpers.ToMauiValue(winUIConverter);
+ if (value is IMauiConverter mauiConverter)
+ {
+ converter = mauiConverter;
+ }
+ }
+
+ var binding = new NativeMauiBinding(Path,
+ mode: BindingMode,
+ converter: converter,
+ converterParameter: ConverterParameter,
+ stringFormat: StringFormat,
+ source: Source);
+
+ view.SetBinding(property, binding);
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/MauiColor.cs b/src/Uno.Extensions.Maui.UI/MauiColor.cs
new file mode 100644
index 0000000000..59006fa04a
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/MauiColor.cs
@@ -0,0 +1,36 @@
+using Microsoft.Maui.Controls;
+
+namespace Uno.Extensions.Maui;
+
+
+///
+/// This class represents a markup extension that converts a string representation of a color into a NativeMauiColor object.
+///
+[MarkupExtensionReturnType(ReturnType = typeof(NativeMauiColor))]
+public class MauiColor : MauiExtensionBase
+{
+ ///
+ /// Gets or sets the string representation of the color value.
+ ///
+ public string Value { get; set; } = string.Empty;
+
+ ///
+ protected override void SetValue(View view, Type viewType, Type propertyType, BindableProperty property, string propertyName)
+ {
+ if (string.IsNullOrEmpty(Value) || !NativeMauiColor.TryParse(Value, out var color))
+ {
+ var canLog = Logger.IsEnabled(LogLevel.Warning);
+ if (string.IsNullOrEmpty(Value) && canLog)
+ {
+ Logger.LogWarning(Properties.Resources.NoColorValueProvided);
+ }
+ else if (canLog)
+ {
+ Logger.LogWarning(Properties.Resources.UnableToConvertValueToColor, Value);
+ }
+ return;
+ }
+
+ view.SetValue(property, color);
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/MauiContent.cs b/src/Uno.Extensions.Maui.UI/MauiContent.cs
new file mode 100644
index 0000000000..e263cf0ae0
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/MauiContent.cs
@@ -0,0 +1,141 @@
+using Microsoft.UI.Xaml.Media;
+using Uno.Extensions.Maui.Internals;
+using static System.Runtime.InteropServices.JavaScript.JSType;
+
+namespace Uno.Extensions.Maui;
+
+///
+/// ContentControl implementation that hosts a Maui view.
+///
+[ContentProperty(Name = nameof(View))]
+public partial class MauiContent : ContentControl
+{
+ ///
+ /// The View property represents the that will be used as content.
+ ///
+ public static readonly DependencyProperty ViewProperty =
+ DependencyProperty.Register(nameof(View), typeof(View), typeof(MauiContent), new PropertyMetadata(null, OnViewChanged));
+
+ private static void OnViewChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
+ {
+ if (args.NewValue is null || args.NewValue is not View view || dependencyObject is not MauiContent embeddedView)
+ {
+ return;
+ }
+
+ if (embeddedView._host is not null)
+ {
+ view.Parent = embeddedView._host;
+ }
+
+ try
+ {
+ var native = view.ToPlatform(embeddedView.MauiContext);
+ embeddedView.Content = native;
+ }
+ catch (Exception ex)
+ {
+ var logger = GetLogger();
+ if (logger.IsEnabled(LogLevel.Error))
+ {
+ logger.LogError(ex, Properties.Resources.UnableToConvertMauiViewToNativeView);
+ }
+#if DEBUG
+ System.Diagnostics.Debugger.Break();
+#endif
+ throw new MauiEmbeddingException(Properties.Resources.UnexpectedErrorConvertingMauiViewToNativeView, ex);
+ }
+ }
+
+ private static ILogger GetLogger() =>
+ MauiEmbedding.MauiContext.Services.GetRequiredService>();
+
+ private UnoHost? _host;
+
+ private readonly IMauiContext MauiContext;
+
+ ///
+ /// Initializes a new instance of the MauiContent class.
+ ///
+ public MauiContent()
+ {
+ MauiContext = MauiEmbedding.MauiContext;
+ Loading += OnLoading;
+ DataContextChanged += OnDataContextChanged;
+ Unloaded += OnMauiContentUnloaded;
+ }
+
+ private void OnMauiContentUnloaded(object sender, RoutedEventArgs e)
+ {
+ Unloaded -= OnMauiContentUnloaded;
+ Loading -= OnLoading;
+ DataContextChanged -= OnDataContextChanged;
+ if (_host is not null)
+ {
+ _host.BindingContext = null;
+ }
+ _host = null;
+ }
+
+ ///
+ /// Gets or sets the that will be used as content.
+ ///
+ public View View
+ {
+ get => (View)GetValue(ViewProperty);
+ set => SetValue(ViewProperty, value);
+ }
+
+ private void OnLoading(FrameworkElement sender, object args)
+ {
+ Loading -= OnLoading;
+ DependencyObject? treeElement = this;
+ var resources = new ResourceDictionary();
+ while (treeElement is not null)
+ {
+ if (treeElement is FrameworkElement element && element.Resources.Any())
+ {
+ foreach ((var key, var value) in element.Resources)
+ {
+ if (resources.ContainsKey(key))
+ {
+ continue;
+ }
+ resources[key] = value;
+ }
+ }
+
+ treeElement = VisualTreeHelper.GetParent(treeElement);
+ }
+
+ _host = new UnoHost(resources)
+ {
+ BindingContext = DataContext
+ };
+
+ if (View.Parent is null)
+ {
+ View.Parent = _host;
+ }
+ }
+
+ void OnDataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
+ {
+ if (DataContext is null)
+ {
+ System.Console.WriteLine("MauiContent.DataContext is null");
+ }
+ else
+ {
+ System.Console.WriteLine($"MauiContent.DataContext is {DataContext.GetType().FullName}");
+ }
+
+
+ if (_host is not null && _host.BindingContext != DataContext)
+ {
+ _host.BindingContext = DataContext;
+ View.BindingContext = DataContext;
+ }
+ //DataContextChanged -= OnDataContextChanged;
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/MauiEmbedding.cs b/src/Uno.Extensions.Maui.UI/MauiEmbedding.cs
new file mode 100644
index 0000000000..92239ed0e4
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/MauiEmbedding.cs
@@ -0,0 +1,74 @@
+using Uno.Extensions.Hosting;
+using Microsoft.Maui.Controls.Hosting;
+using Microsoft.Maui.Hosting;
+using Uno.Extensions.Maui.Internals;
+
+namespace Uno.Extensions.Maui;
+
+///
+/// Embedding support for Microsoft.Maui controls in Uno Platform app hosts.
+///
+public static class MauiEmbedding
+{
+ private static MauiApp? _app;
+ internal static IMauiContext MauiContext =>
+#if ANDROID
+ _app is not null ? new MauiContext(_app.Services, UI.ContextHelper.Current)
+ : throw new MauiEmbeddingInitializationException();
+#else
+ _app is not null ? new MauiContext(_app.Services)
+ : throw new MauiEmbeddingInitializationException();
+#endif
+
+ ///
+ /// Registers Maui embedding in the Uno Platform app builder.
+ ///
+ /// The updated app builder.
+ /// The Uno app builder.
+ /// Optional lambda to configure the Maui app builder.
+ public static IApplicationBuilder UseMauiEmbedding(this IApplicationBuilder builder, Action? configure = null)
+ {
+ builder.App.UseMauiEmbedding(configure);
+ return builder;
+ }
+
+ ///
+ /// Registers Maui embedding with WinUI3 and WPF application builder.
+ ///
+ /// The Uno app.
+ /// Optional lambda to configure the Maui app builder.
+ public static void UseMauiEmbedding(this Microsoft.UI.Xaml.Application app, Action? configure = null)
+ {
+ var mauiAppBuilder = MauiApp.CreateBuilder()
+ .UseMauiEmbedding();
+
+ configure?.Invoke(mauiAppBuilder);
+
+#if IOS || MACCATALYST
+ mauiAppBuilder.Services.AddTransient(_ =>
+ app.Window!);
+#endif
+
+ mauiAppBuilder.Services.AddSingleton(app)
+ .AddSingleton();
+ _app = mauiAppBuilder.Build();
+ }
+
+ // NOTE: This was part of the POC and is out of scope for the MVP. Keeping it in case we want to add it back later.
+ /*
+ public static MauiAppBuilder MapControl(this MauiAppBuilder builder)
+ where TWinUI : FrameworkElement
+ where TMaui : Microsoft.Maui.Controls.View
+ {
+ Interop.MauiInterop.MapControl();
+ return builder;
+ }
+
+ public static MauiAppBuilder MapStyleHandler(this MauiAppBuilder builder)
+ where THandler : Interop.IWinUIToMauiStyleHandler, new()
+ {
+ Interop.MauiInterop.MapStyleHandler();
+ return builder;
+ }
+ */
+}
diff --git a/src/Uno.Extensions.Maui.UI/MauiEmbeddingException.cs b/src/Uno.Extensions.Maui.UI/MauiEmbeddingException.cs
new file mode 100644
index 0000000000..5b0a600147
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/MauiEmbeddingException.cs
@@ -0,0 +1,28 @@
+namespace Uno.Extensions.Maui;
+
+///
+/// Represents an exception related to Maui embedding.
+///
+public class MauiEmbeddingException : Exception
+{
+ ///
+ /// Initializes a new instance of the class
+ /// with a specified error message.
+ ///
+ /// The message that describes the error.
+ internal MauiEmbeddingException(string message)
+ : base(message)
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class
+ /// with a specified error message and inner exception.
+ ///
+ /// The message that describes the error.
+ /// The exception that is the cause of the current exception.
+ internal MauiEmbeddingException(string message, Exception innerException)
+ : base(message, innerException)
+ {
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/MauiEmbeddingInitializationException.cs b/src/Uno.Extensions.Maui.UI/MauiEmbeddingInitializationException.cs
new file mode 100644
index 0000000000..c92c14c84a
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/MauiEmbeddingInitializationException.cs
@@ -0,0 +1,20 @@
+namespace Uno.Extensions.Maui;
+
+///
+/// Represents an that occurs during Maui embedding initialization.
+///
+public sealed class MauiEmbeddingInitializationException : MauiEmbeddingException
+{
+ ///
+ /// Gets the error message for the .
+ ///
+ public static string ErrorMessage => Properties.Resources.MauiEmbeddingInitializationExceptionMessage;
+
+ ///
+ /// Initializes a new instance of the class with the error message.
+ ///
+ internal MauiEmbeddingInitializationException()
+ : base(ErrorMessage)
+ {
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/MauiExtensionBase.cs b/src/Uno.Extensions.Maui.UI/MauiExtensionBase.cs
new file mode 100644
index 0000000000..64bc8f4ec2
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/MauiExtensionBase.cs
@@ -0,0 +1,96 @@
+using System.Diagnostics;
+using System.Reflection;
+using Microsoft.Maui.Controls;
+using UnoMusicApp.Helpers;
+
+namespace Uno.Extensions.Maui;
+
+///
+/// Abstract class for extending in the context of .
+///
+public abstract class MauiExtensionBase : MarkupExtension
+{
+ private ILogger? _logger;
+
+ ///
+ /// Logger to log messages during runtime.
+ ///
+ protected ILogger Logger => _logger ??= GetLogger();
+
+ ///
+ protected sealed override object? ProvideValue(IXamlServiceProvider serviceProvider)
+ {
+ var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
+ ThreadHelpers.WhatThreadAmI();
+
+ if (provideValueTarget?.TargetObject is View view && provideValueTarget.TargetProperty is ProvideValueTargetProperty targetProperty)
+ {
+ var declaringType = targetProperty.DeclaringType;
+ var targetType = declaringType.GetRuntimeProperty(targetProperty.Name)?.PropertyType;
+
+ void OnParented(object? sender, EventArgs args)
+ {
+ view.ParentChanged -= OnParented;
+ var bindablePropertyInfo = targetProperty.DeclaringType.GetRuntimeField($"{targetProperty.Name}Property");
+ var bindableProperty = bindablePropertyInfo?.GetValue(null) as Microsoft.Maui.Controls.BindableProperty;
+
+ var name = targetProperty.Name;
+
+ if (targetType is null || bindableProperty is null)
+ {
+ var canLog = Logger.IsEnabled(LogLevel.Debug);
+
+ // TODO: Update with XAML Line info
+ if (targetType is null && canLog)
+ {
+ Logger.LogDebug("The Target Type is null");
+ }
+
+ if (bindableProperty is null && canLog)
+ {
+ Logger.LogDebug("The BindableProperty is null");
+ }
+#if DEBUG
+ System.Diagnostics.Debugger.Break();
+#endif
+ return;
+ }
+
+ SetValue(view, declaringType, targetType, bindableProperty, name);
+ }
+ view.ParentChanged += OnParented;
+
+ if (targetType is not null)
+ {
+ return Default(targetType);
+ }
+ }
+
+ return base.ProvideValue(serviceProvider);
+ }
+
+ private ILogger GetLogger()
+ {
+ var factory = MauiEmbedding.MauiContext.Services.GetRequiredService();
+ var implementingType = GetType();
+ return factory.CreateLogger(implementingType.Name);
+ }
+
+ ///
+ /// Abstract method to set the value of a .
+ ///
+ /// The view to set the property value on.
+ /// The type of view to set the property value on.
+ /// The type of the property to set.
+ /// The to set.
+ /// The name of the property to set.
+ protected abstract void SetValue(View view, Type viewType, Type propertyType, BindableProperty property, string propertyName);
+
+ ///
+ /// Returns a default value of .
+ ///
+ /// Type of the target.
+ /// Default value of .
+ protected object? Default(Type type) =>
+ type.IsValueType ? Activator.CreateInstance(type) : null;
+}
diff --git a/src/Uno.Extensions.Maui.UI/MauiResource.cs b/src/Uno.Extensions.Maui.UI/MauiResource.cs
new file mode 100644
index 0000000000..571fdbcb92
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/MauiResource.cs
@@ -0,0 +1,41 @@
+using Microsoft.Maui.Controls;
+using ContentPropertyAttribute = Microsoft.UI.Xaml.Markup.ContentPropertyAttribute;
+
+namespace Uno.Extensions.Maui;
+
+///
+/// A helper class used to set the value of a view's property by its key.
+///
+[ContentProperty(Name = nameof(Key))]
+[MarkupExtensionReturnType(ReturnType = typeof(object))]
+public class MauiResource : MauiExtensionBase
+{
+ ///
+ /// The key for the resource to be retrieved and set.
+ ///
+ public string Key { get; set; } = string.Empty;
+
+ ///
+ /// Sets the value of the view's property by the key.
+ ///
+ /// The whose property value will be set.
+ /// The type of the view.
+ /// The type of the property.
+ /// The property whose value will be set.
+ /// The name of the property.
+ protected override void SetValue(View view, Type viewType, Type propertyType, BindableProperty property, string propertyName)
+ {
+ if (string.IsNullOrEmpty(Key))
+ {
+ return;
+ }
+ else if (view.Resources.ContainsKey(Key) && view.Resources.TryGetValue(Key, out var value) && propertyType.IsAssignableFrom(value.GetType()))
+ {
+ view.SetValue(property, value);
+ }
+ else
+ {
+ view.SetDynamicResource(property, Key);
+ }
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/MauiThickness.cs b/src/Uno.Extensions.Maui.UI/MauiThickness.cs
new file mode 100644
index 0000000000..2eaa4308fe
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/MauiThickness.cs
@@ -0,0 +1,40 @@
+namespace Uno.Extensions.Maui;
+
+///
+/// Provides a markup extension for creating a object from a string.
+///
+[MarkupExtensionReturnType(ReturnType = typeof(Microsoft.Maui.Thickness))]
+public class MauiThickness : MarkupExtension
+{
+ ///
+ /// Gets or sets the string value to convert into a object.
+ ///
+ public string Value { get; set; } = string.Empty;
+
+ ///
+ protected override object ProvideValue()
+ {
+ if (string.IsNullOrEmpty(Value))
+ {
+ return global::Microsoft.Maui.Thickness.Zero;
+ }
+
+ var temp = Value.Split(',')
+ .Select(x => x.Trim())
+ .Select(x => double.TryParse(x, out var thickness) ? (object)thickness : x);
+
+ var values = temp.OfType().ToArray();
+ if (temp.Count() != values.Length)
+ {
+ throw new MauiEmbeddingException($"Unable to parse the Thickness string '{Value}'.");
+ }
+
+ return values.Length switch
+ {
+ 1 => new Microsoft.Maui.Thickness(values[0]),
+ 2 => new Microsoft.Maui.Thickness(values[0], values[1]),
+ 4 => new Microsoft.Maui.Thickness(values[0], values[1], values[2], values[3]),
+ _ => throw new MauiEmbeddingException($"The Thickness string '{Value}' has an invalid number of arguments")
+ };
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Models/MauiToWinUIStyleMapping.cs b/src/Uno.Extensions.Maui.UI/Models/MauiToWinUIStyleMapping.cs
new file mode 100644
index 0000000000..9f3e4769ed
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Models/MauiToWinUIStyleMapping.cs
@@ -0,0 +1,5 @@
+using Microsoft.Maui.Controls;
+
+namespace Uno.Extensions.Maui.Models;
+
+public record MauiToWinUIStyleMapping(BindableProperty Property, object ? Value);
diff --git a/src/Uno.Extensions.Maui.UI/Properties/Resources.Designer.cs b/src/Uno.Extensions.Maui.UI/Properties/Resources.Designer.cs
new file mode 100644
index 0000000000..c44f4e433c
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Properties/Resources.Designer.cs
@@ -0,0 +1,108 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Uno.Extensions.Maui.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Uno.Extensions.Maui.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to You must call UseMauiEmbedding from the Application.
+ ///
+ internal static string MauiEmbeddingInitializationExceptionMessage {
+ get {
+ return ResourceManager.GetString("MauiEmbeddingInitializationExceptionMessage", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to No value provided for the Maui Color..
+ ///
+ internal static string NoColorValueProvided {
+ get {
+ return ResourceManager.GetString("NoColorValueProvided", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to There was an unexpected error converting the Maui View to a native Platform view..
+ ///
+ internal static string UnableToConvertMauiViewToNativeView {
+ get {
+ return ResourceManager.GetString("UnableToConvertMauiViewToNativeView", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Unable to convert '{Value}' to a Maui Color..
+ ///
+ internal static string UnableToConvertValueToColor {
+ get {
+ return ResourceManager.GetString("UnableToConvertValueToColor", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to An unexpected error occurred while converting the Maui View to a native View..
+ ///
+ internal static string UnexpectedErrorConvertingMauiViewToNativeView {
+ get {
+ return ResourceManager.GetString("UnexpectedErrorConvertingMauiViewToNativeView", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/src/Uno.Extensions.Maui.UI/Properties/Resources.resx b/src/Uno.Extensions.Maui.UI/Properties/Resources.resx
new file mode 100644
index 0000000000..ea2f1a7e2a
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Properties/Resources.resx
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ You must call UseMauiEmbedding from the Application
+
+
+ No value provided for the Maui Color.
+
+
+ There was an unexpected error converting the Maui View to a native Platform view.
+
+
+ Unable to convert '{Value}' to a Maui Color.
+
+
+ An unexpected error occurred while converting the Maui View to a native View.
+
+
\ No newline at end of file
diff --git a/src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj b/src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj
new file mode 100644
index 0000000000..128f1f23a6
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj
@@ -0,0 +1,40 @@
+
+
+
+
+ true
+ Uno.Extensions.Maui
+ $(NoWarn);NU5104;NU5048;NU1009
+ Extensions to embed .NET MAUI controls within your Uno app.
+
+ $(WarningsNotAsErrors);CS1591
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+
+
+
diff --git a/src/Uno.Extensions.Maui.UI/build/Package.props b/src/Uno.Extensions.Maui.UI/build/Package.props
new file mode 100644
index 0000000000..163ffc3bf1
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/build/Package.props
@@ -0,0 +1,9 @@
+
+
+ true
+ false
+ <_MauiSkipSdkAutoImport>true
+ false
+ false
+
+
diff --git a/src/Uno.Extensions.Maui.UI/build/Package.targets b/src/Uno.Extensions.Maui.UI/build/Package.targets
new file mode 100644
index 0000000000..3c9fe37500
--- /dev/null
+++ b/src/Uno.Extensions.Maui.UI/build/Package.targets
@@ -0,0 +1,64 @@
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_MauiImplicitPackageReference Remove="Microsoft.Maui.Resizetizer" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Uno.Extensions.Navigation.Toolkit/Uno.Extensions.Navigation.Toolkit.WinUI.csproj b/src/Uno.Extensions.Navigation.Toolkit/Uno.Extensions.Navigation.Toolkit.WinUI.csproj
index 5b501a179e..d9a850fdd5 100644
--- a/src/Uno.Extensions.Navigation.Toolkit/Uno.Extensions.Navigation.Toolkit.WinUI.csproj
+++ b/src/Uno.Extensions.Navigation.Toolkit/Uno.Extensions.Navigation.Toolkit.WinUI.csproj
@@ -17,7 +17,7 @@
-
+
diff --git a/src/Uno.Extensions.Navigation.UI/Uno.Extensions.Navigation.WinUI.csproj b/src/Uno.Extensions.Navigation.UI/Uno.Extensions.Navigation.WinUI.csproj
index 8d87c9b3ae..786205b502 100644
--- a/src/Uno.Extensions.Navigation.UI/Uno.Extensions.Navigation.WinUI.csproj
+++ b/src/Uno.Extensions.Navigation.UI/Uno.Extensions.Navigation.WinUI.csproj
@@ -13,7 +13,7 @@
$(DefineConstants);WINUI
-
+
diff --git a/src/Uno.Extensions.Reactive.UI/Uno.Extensions.Reactive.WinUI.csproj b/src/Uno.Extensions.Reactive.UI/Uno.Extensions.Reactive.WinUI.csproj
index f6f087329c..8399142f27 100644
--- a/src/Uno.Extensions.Reactive.UI/Uno.Extensions.Reactive.WinUI.csproj
+++ b/src/Uno.Extensions.Reactive.UI/Uno.Extensions.Reactive.WinUI.csproj
@@ -16,7 +16,7 @@
-
+
diff --git a/src/Uno.Extensions.RuntimeTests.Core/Uno.Extensions.RuntimeTests.Core.csproj b/src/Uno.Extensions.RuntimeTests.Core/Uno.Extensions.RuntimeTests.Core.csproj
index 5462855e1f..103387ff31 100644
--- a/src/Uno.Extensions.RuntimeTests.Core/Uno.Extensions.RuntimeTests.Core.csproj
+++ b/src/Uno.Extensions.RuntimeTests.Core/Uno.Extensions.RuntimeTests.Core.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Mobile/Uno.Extensions.RuntimeTests.Mobile.csproj b/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Mobile/Uno.Extensions.RuntimeTests.Mobile.csproj
index 73ae0747ff..169dc05f8f 100644
--- a/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Mobile/Uno.Extensions.RuntimeTests.Mobile.csproj
+++ b/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Mobile/Uno.Extensions.RuntimeTests.Mobile.csproj
@@ -30,11 +30,11 @@
-
-
-
+
+
+
-
+
diff --git a/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Skia.Gtk/Uno.Extensions.RuntimeTests.Skia.Gtk.csproj b/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Skia.Gtk/Uno.Extensions.RuntimeTests.Skia.Gtk.csproj
index 51cb317d3c..f1c630f6c4 100644
--- a/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Skia.Gtk/Uno.Extensions.RuntimeTests.Skia.Gtk.csproj
+++ b/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Skia.Gtk/Uno.Extensions.RuntimeTests.Skia.Gtk.csproj
@@ -19,10 +19,10 @@
-
-
-
-
+
+
+
+
diff --git a/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Skia.Wpf/Uno.Extensions.RuntimeTests.Skia.Wpf.csproj b/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Skia.Wpf/Uno.Extensions.RuntimeTests.Skia.Wpf.csproj
index 14315d3e58..4bb4e5d5aa 100644
--- a/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Skia.Wpf/Uno.Extensions.RuntimeTests.Skia.Wpf.csproj
+++ b/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Skia.Wpf/Uno.Extensions.RuntimeTests.Skia.Wpf.csproj
@@ -26,10 +26,10 @@
-
-
-
-
+
+
+
+
diff --git a/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Wasm/Uno.Extensions.RuntimeTests.Wasm.csproj b/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Wasm/Uno.Extensions.RuntimeTests.Wasm.csproj
index 1d7369274e..e871449ee4 100644
--- a/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Wasm/Uno.Extensions.RuntimeTests.Wasm.csproj
+++ b/src/Uno.Extensions.RuntimeTests/Uno.Extensions.RuntimeTests.Wasm/Uno.Extensions.RuntimeTests.Wasm.csproj
@@ -49,12 +49,12 @@
-
-
-
+
+
+
-
+
diff --git a/src/Uno.Extensions.sln b/src/Uno.Extensions.sln
index c71d56f88f..c9f6c2766f 100644
--- a/src/Uno.Extensions.sln
+++ b/src/Uno.Extensions.sln
@@ -190,6 +190,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Http.UI", "U
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Http.WinUI", "Uno.Extensions.Http.UI\Uno.Extensions.Http.WinUI.csproj", "{E2F71C96-1C18-4C05-AD21-94231A260436}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Maui", "Uno.Extensions.Maui.UI\Uno.Extensions.Maui.WinUI.csproj", "{D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Maui", "Maui", "{2197ADCE-59C4-465A-B380-0B06BF68BBBC}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1080,6 +1084,22 @@ Global
{E2F71C96-1C18-4C05-AD21-94231A260436}.Release|x64.Build.0 = Release|Any CPU
{E2F71C96-1C18-4C05-AD21-94231A260436}.Release|x86.ActiveCfg = Release|Any CPU
{E2F71C96-1C18-4C05-AD21-94231A260436}.Release|x86.Build.0 = Release|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Debug|arm64.Build.0 = Debug|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Debug|x64.Build.0 = Debug|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Debug|x86.Build.0 = Debug|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Release|arm64.ActiveCfg = Release|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Release|arm64.Build.0 = Release|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Release|x64.ActiveCfg = Release|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Release|x64.Build.0 = Release|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Release|x86.ActiveCfg = Release|Any CPU
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1151,6 +1171,7 @@ Global
{2F076ADB-04CE-4C75-A63E-90A160BB4C30} = {2B4C9E46-EA70-4ADE-B301-E2BB8CC31365}
{AF45A54A-A0A9-439A-B0C9-82ABAF46E624} = {45179294-70DC-47E8-AD22-1296F897B594}
{E2F71C96-1C18-4C05-AD21-94231A260436} = {45179294-70DC-47E8-AD22-1296F897B594}
+ {D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350} = {2197ADCE-59C4-465A-B380-0B06BF68BBBC}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6E7B035D-9A64-4D95-89AA-9D4653F17C42}
diff --git a/src/tfms-ui-maui.props b/src/tfms-ui-maui.props
new file mode 100644
index 0000000000..ca64be2999
--- /dev/null
+++ b/src/tfms-ui-maui.props
@@ -0,0 +1,12 @@
+
+
+
+ $(UnoTargetFrameworkOverride)
+
+
+ $(TargetFrameworks);net7.0-ios
+ $(TargetFrameworks);net7.0-maccatalyst
+ $(TargetFrameworks);net7.0-android
+ $(TargetFrameworks);net7.0-windows10.0.19041
+
+
diff --git a/testing/TestHarness/Directory.Packages.props b/testing/TestHarness/Directory.Packages.props
index 1a4143ae3c..3543ee34c2 100644
--- a/testing/TestHarness/Directory.Packages.props
+++ b/testing/TestHarness/Directory.Packages.props
@@ -44,15 +44,15 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
@@ -60,13 +60,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+