From 4f3632d74acef6b644eb87c0d6e488d456bfea31 Mon Sep 17 00:00:00 2001 From: Dan Siegel Date: Wed, 31 May 2023 11:27:20 -0600 Subject: [PATCH 01/82] feat: add Maui Embedding --- src/Directory.Build.targets | 4 +- src/Directory.Packages.props | 16 +-- src/Uno.Extensions.Maui/GlobalUsings.cs | 29 ++++ .../Internals/ConversionExtensions.cs | 43 ++++++ .../Internals/ConversionHelpers.cs | 57 ++++++++ src/Uno.Extensions.Maui/Internals/UnoHost.cs | 9 ++ .../Internals/UnoMauiEmbeddingInitializer.cs | 43 ++++++ .../Interop/IWinUIToMauiStyleHandler.cs | 8 ++ .../Interop/LabelStyleHandler.cs | 20 +++ .../Interop/LayoutStyleHandler.cs | 13 ++ .../Interop/MauiInterop.cs | 80 +++++++++++ .../Interop/ViewStyleHandler.cs | 13 ++ .../Interop/VisualElementStyleHandler.cs | 13 ++ .../Interop/WinUIToMauiStyleHandler.cs | 29 ++++ src/Uno.Extensions.Maui/MauiBinding.cs | 51 +++++++ src/Uno.Extensions.Maui/MauiColor.cs | 30 ++++ src/Uno.Extensions.Maui/MauiContent.cs | 95 ++++++++++++ src/Uno.Extensions.Maui/MauiEmbedding.cs | 68 +++++++++ .../MauiEmbeddingException.cs | 14 ++ .../MauiEmbeddingInitializationException.cs | 11 ++ src/Uno.Extensions.Maui/MauiExtensionBase.cs | 73 ++++++++++ src/Uno.Extensions.Maui/MauiResource.cs | 27 ++++ .../Properties/Resources.Designer.cs | 108 ++++++++++++++ .../Properties/Resources.resx | 135 ++++++++++++++++++ .../Uno.Extensions.Maui.WinUI.csproj | 39 +++++ src/Uno.Extensions.Maui/build/Package.props | 9 ++ src/Uno.Extensions.Maui/build/Package.targets | 59 ++++++++ src/Uno.Extensions.sln | 21 +++ 28 files changed, 1107 insertions(+), 10 deletions(-) create mode 100644 src/Uno.Extensions.Maui/GlobalUsings.cs create mode 100644 src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs create mode 100644 src/Uno.Extensions.Maui/Internals/ConversionHelpers.cs create mode 100644 src/Uno.Extensions.Maui/Internals/UnoHost.cs create mode 100644 src/Uno.Extensions.Maui/Internals/UnoMauiEmbeddingInitializer.cs create mode 100644 src/Uno.Extensions.Maui/Interop/IWinUIToMauiStyleHandler.cs create mode 100644 src/Uno.Extensions.Maui/Interop/LabelStyleHandler.cs create mode 100644 src/Uno.Extensions.Maui/Interop/LayoutStyleHandler.cs create mode 100644 src/Uno.Extensions.Maui/Interop/MauiInterop.cs create mode 100644 src/Uno.Extensions.Maui/Interop/ViewStyleHandler.cs create mode 100644 src/Uno.Extensions.Maui/Interop/VisualElementStyleHandler.cs create mode 100644 src/Uno.Extensions.Maui/Interop/WinUIToMauiStyleHandler.cs create mode 100644 src/Uno.Extensions.Maui/MauiBinding.cs create mode 100644 src/Uno.Extensions.Maui/MauiColor.cs create mode 100644 src/Uno.Extensions.Maui/MauiContent.cs create mode 100644 src/Uno.Extensions.Maui/MauiEmbedding.cs create mode 100644 src/Uno.Extensions.Maui/MauiEmbeddingException.cs create mode 100644 src/Uno.Extensions.Maui/MauiEmbeddingInitializationException.cs create mode 100644 src/Uno.Extensions.Maui/MauiExtensionBase.cs create mode 100644 src/Uno.Extensions.Maui/MauiResource.cs create mode 100644 src/Uno.Extensions.Maui/Properties/Resources.Designer.cs create mode 100644 src/Uno.Extensions.Maui/Properties/Resources.resx create mode 100644 src/Uno.Extensions.Maui/Uno.Extensions.Maui.WinUI.csproj create mode 100644 src/Uno.Extensions.Maui/build/Package.props create mode 100644 src/Uno.Extensions.Maui/build/Package.targets diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 1c8bffad50..a7aed56f32 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -48,8 +48,8 @@ - - + + diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 817ba4376b..81f399a147 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -8,20 +8,20 @@ - - - - - - + + + + + + - - + + diff --git a/src/Uno.Extensions.Maui/GlobalUsings.cs b/src/Uno.Extensions.Maui/GlobalUsings.cs new file mode 100644 index 0000000000..e62d2bcf98 --- /dev/null +++ b/src/Uno.Extensions.Maui/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 MauiConverter = Microsoft.Maui.Controls.IValueConverter; +global using WinUIConverter = Microsoft.UI.Xaml.Data.IValueConverter; + diff --git a/src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs b/src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs new file mode 100644 index 0000000000..6080cec2b7 --- /dev/null +++ b/src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs @@ -0,0 +1,43 @@ +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()); + } + + foreach (var key in input.Keys) + { + if (input.MergedDictionaries.Any(x => x.ContainsKey(key))) + { + continue; + } + + TryAddValue(ref output, key, input[key]); + } + + return output; + } + + private static void TryAddValue(ref Microsoft.Maui.Controls.ResourceDictionary resources, object sourceKey, object value) + { + 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/Internals/ConversionHelpers.cs b/src/Uno.Extensions.Maui/Internals/ConversionHelpers.cs new file mode 100644 index 0000000000..a28e5ce4a5 --- /dev/null +++ b/src/Uno.Extensions.Maui/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, + WinUIConverter 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 : MauiConverter + { + private WinUIConverter _converter { get; } + + public UnoHostConverter(WinUIConverter 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/Internals/UnoHost.cs b/src/Uno.Extensions.Maui/Internals/UnoHost.cs new file mode 100644 index 0000000000..a69cbd2370 --- /dev/null +++ b/src/Uno.Extensions.Maui/Internals/UnoHost.cs @@ -0,0 +1,9 @@ +namespace Uno.Extensions.Maui.Internals; + +internal class UnoHost : Microsoft.Maui.Controls.VisualElement +{ + public UnoHost(ResourceDictionary resources) + { + Resources = resources.ToMauiResources(); + } +} diff --git a/src/Uno.Extensions.Maui/Internals/UnoMauiEmbeddingInitializer.cs b/src/Uno.Extensions.Maui/Internals/UnoMauiEmbeddingInitializer.cs new file mode 100644 index 0000000000..01d2c3d14e --- /dev/null +++ b/src/Uno.Extensions.Maui/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/Interop/IWinUIToMauiStyleHandler.cs b/src/Uno.Extensions.Maui/Interop/IWinUIToMauiStyleHandler.cs new file mode 100644 index 0000000000..35f349bc9d --- /dev/null +++ b/src/Uno.Extensions.Maui/Interop/IWinUIToMauiStyleHandler.cs @@ -0,0 +1,8 @@ +namespace Uno.Extensions.Maui.Interop; + +public interface IWinUIToMauiStyleHandler +{ + Type TargetType { get; } + + (Microsoft.Maui.Controls.BindableProperty Property, object? Value)? Process(DependencyProperty property, object value); +} diff --git a/src/Uno.Extensions.Maui/Interop/LabelStyleHandler.cs b/src/Uno.Extensions.Maui/Interop/LabelStyleHandler.cs new file mode 100644 index 0000000000..ddbab3bd9d --- /dev/null +++ b/src/Uno.Extensions.Maui/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 (Microsoft.Maui.Controls.BindableProperty Property, object? Value)? Process(DependencyProperty property, object value) + { + if (property == Control.ForegroundProperty && TryConvertValue(value, out var converted) && converted is Microsoft.Maui.Controls.SolidColorBrush brush) + { + return (Microsoft.Maui.Controls.Label.TextColorProperty, brush.Color); + } + else if (property == TextBlock.FontSizeProperty) + { + return (Microsoft.Maui.Controls.Label.FontSizeProperty, ConvertToMauiValue(value)); + } + + return null; + } +} diff --git a/src/Uno.Extensions.Maui/Interop/LayoutStyleHandler.cs b/src/Uno.Extensions.Maui/Interop/LayoutStyleHandler.cs new file mode 100644 index 0000000000..d22ef34a30 --- /dev/null +++ b/src/Uno.Extensions.Maui/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 (Microsoft.Maui.Controls.BindableProperty Property, object? Value)? Process(DependencyProperty property, object value) + { + return property == Control.PaddingProperty + ? (Microsoft.Maui.Controls.Layout.PaddingProperty, ConvertToMauiValue(value)) + : null; + } +} diff --git a/src/Uno.Extensions.Maui/Interop/MauiInterop.cs b/src/Uno.Extensions.Maui/Interop/MauiInterop.cs new file mode 100644 index 0000000000..e4415f68ed --- /dev/null +++ b/src/Uno.Extensions.Maui/Interop/MauiInterop.cs @@ -0,0 +1,80 @@ +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); + + handlers.ForEach(handler => + { + var processed = handler.Process(setter.Property, setter.Value); + if (processed is null) + { + return; + } + + tempStyle.Setters.Add(new Microsoft.Maui.Controls.Setter { Property = processed.Value.Property, Value = processed.Value.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/Interop/ViewStyleHandler.cs b/src/Uno.Extensions.Maui/Interop/ViewStyleHandler.cs new file mode 100644 index 0000000000..24d4356235 --- /dev/null +++ b/src/Uno.Extensions.Maui/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 (Microsoft.Maui.Controls.BindableProperty Property, object? Value)? Process(DependencyProperty property, object value) + { + return property == Control.MarginProperty + ? (Microsoft.Maui.Controls.View.MarginProperty, ConvertToMauiValue(value)) + : null; + } +} diff --git a/src/Uno.Extensions.Maui/Interop/VisualElementStyleHandler.cs b/src/Uno.Extensions.Maui/Interop/VisualElementStyleHandler.cs new file mode 100644 index 0000000000..a7077700fe --- /dev/null +++ b/src/Uno.Extensions.Maui/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 (Microsoft.Maui.Controls.BindableProperty Property, object? Value)? Process(DependencyProperty property, object value) + { + return property == Control.BackgroundProperty + ? (Microsoft.Maui.Controls.VisualElement.BackgroundProperty, ConvertToMauiValue(value)) + : null; + } +} diff --git a/src/Uno.Extensions.Maui/Interop/WinUIToMauiStyleHandler.cs b/src/Uno.Extensions.Maui/Interop/WinUIToMauiStyleHandler.cs new file mode 100644 index 0000000000..473864f31d --- /dev/null +++ b/src/Uno.Extensions.Maui/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 (Microsoft.Maui.Controls.BindableProperty Property, object? Value)? 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/MauiBinding.cs b/src/Uno.Extensions.Maui/MauiBinding.cs new file mode 100644 index 0000000000..72bc991834 --- /dev/null +++ b/src/Uno.Extensions.Maui/MauiBinding.cs @@ -0,0 +1,51 @@ +using Uno.Extensions.Maui.Internals; + +namespace Uno.Extensions.Maui; + +[ContentProperty(Name = nameof(Path))] +public class MauiBinding : MauiExtensionBase +{ + public string? Path { get; set; } + + public BindingMode BindingMode { get; set; } = BindingMode.Default; + + public string? StringFormat { get; set; } + + public object? Converter { get; set; } + + public object? ConverterParameter { get; set; } + + 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 = "."; + } + + + MauiConverter? converter = null; + if (Converter is MauiConverter converterAsMauiConverter) + { + converter = converterAsMauiConverter; + } + else if (Converter is WinUIConverter winUIConverter) + { + var value = ConversionHelpers.ToMauiValue(winUIConverter); + if (value is MauiConverter 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/MauiColor.cs b/src/Uno.Extensions.Maui/MauiColor.cs new file mode 100644 index 0000000000..67aae37fd4 --- /dev/null +++ b/src/Uno.Extensions.Maui/MauiColor.cs @@ -0,0 +1,30 @@ +using Microsoft.Maui.Controls; + +namespace Uno.Extensions.Maui; + +[MarkupExtensionReturnType(ReturnType = typeof(NativeMauiColor))] +public class MauiColor : MauiExtensionBase +{ + 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/MauiContent.cs b/src/Uno.Extensions.Maui/MauiContent.cs new file mode 100644 index 0000000000..d05a832aad --- /dev/null +++ b/src/Uno.Extensions.Maui/MauiContent.cs @@ -0,0 +1,95 @@ +using Microsoft.Extensions.Logging; +using Microsoft.UI.Xaml.Media; +using Uno.Extensions.Maui.Internals; +using Uno.Logging; + +namespace Uno.Extensions.Maui; + +[ContentProperty(Name = nameof(View))] +public partial class MauiContent : ContentControl +{ + 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; + + public MauiContent() + { + MauiContext = MauiEmbedding.MauiContext; + Loading += OnLoading; + } + + 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); + var binding = new NativeMauiBinding(nameof(DataContext), BindingMode.OneWay, source: this); + _host.SetBinding(UnoHost.BindingContextProperty, binding); + + if (View.Parent is null) + { + View.Parent = _host; + } + } +} diff --git a/src/Uno.Extensions.Maui/MauiEmbedding.cs b/src/Uno.Extensions.Maui/MauiEmbedding.cs new file mode 100644 index 0000000000..ab2951e0b8 --- /dev/null +++ b/src/Uno.Extensions.Maui/MauiEmbedding.cs @@ -0,0 +1,68 @@ +using Uno.Extensions.Hosting; +using Microsoft.Maui.Controls.Hosting; +using Microsoft.Maui.Hosting; +using Uno.Extensions.Maui.Internals; + +namespace Uno.Extensions.Maui; + +public static class MauiEmbedding +{ +#if !NO_PLATFORM + private static MauiApp? _app; +#endif + internal static IMauiContext MauiContext => +#if ANDROID + _app is not null ? new MauiContext(_app.Services, UI.ContextHelper.Current) + : throw new MauiEmbeddingInitializationException(); +#elif NO_PLATFORM + throw new PlatformNotSupportedException(); +#else + _app is not null ? new MauiContext(_app.Services) + : throw new MauiEmbeddingInitializationException(); +#endif + + public static IApplicationBuilder UseMauiEmbedding(this IApplicationBuilder builder, Action? configure = null) + { + builder.App.UseMauiEmbedding(configure); + return builder; + } + +#if NO_PLATFORM + public static void UseMauiEmbedding(this Microsoft.UI.Xaml.Application app, Action? configure = null) + { + throw new PlatformNotSupportedException(); + } +#else + 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(); + } +#endif + + 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/MauiEmbeddingException.cs b/src/Uno.Extensions.Maui/MauiEmbeddingException.cs new file mode 100644 index 0000000000..f3907e56be --- /dev/null +++ b/src/Uno.Extensions.Maui/MauiEmbeddingException.cs @@ -0,0 +1,14 @@ +namespace Uno.Extensions.Maui; + +public class MauiEmbeddingException : Exception +{ + internal MauiEmbeddingException(string message) + : base(message) + { + } + + internal MauiEmbeddingException(string message, Exception innerException) + : base(message, innerException) + { + } +} diff --git a/src/Uno.Extensions.Maui/MauiEmbeddingInitializationException.cs b/src/Uno.Extensions.Maui/MauiEmbeddingInitializationException.cs new file mode 100644 index 0000000000..da81efaee8 --- /dev/null +++ b/src/Uno.Extensions.Maui/MauiEmbeddingInitializationException.cs @@ -0,0 +1,11 @@ +namespace Uno.Extensions.Maui; + +public sealed class MauiEmbeddingInitializationException : MauiEmbeddingException +{ + public static string ErrorMessage => Properties.Resources.MauiEmbeddingInitializationExceptionMessage; + + internal MauiEmbeddingInitializationException() + : base(ErrorMessage) + { + } +} diff --git a/src/Uno.Extensions.Maui/MauiExtensionBase.cs b/src/Uno.Extensions.Maui/MauiExtensionBase.cs new file mode 100644 index 0000000000..9d4064a12f --- /dev/null +++ b/src/Uno.Extensions.Maui/MauiExtensionBase.cs @@ -0,0 +1,73 @@ +using System.Reflection; +using Microsoft.Extensions.Logging; +using Microsoft.Maui.Controls; + +namespace Uno.Extensions.Maui; + +public abstract class MauiExtensionBase : MarkupExtension +{ + private ILogger? _logger; + protected ILogger Logger => _logger ??= GetLogger(); + + protected sealed override object? ProvideValue(IXamlServiceProvider serviceProvider) + { + var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); + + 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 implemenatingType = GetType(); + return factory.CreateLogger(implemenatingType.Name); + } + + protected abstract void SetValue(View view, Type viewType, Type propertyType, BindableProperty property, string propertyName); + + protected object? Default(Type type) => + type.IsValueType ? Activator.CreateInstance(type) : null; +} diff --git a/src/Uno.Extensions.Maui/MauiResource.cs b/src/Uno.Extensions.Maui/MauiResource.cs new file mode 100644 index 0000000000..e9d3d4de9c --- /dev/null +++ b/src/Uno.Extensions.Maui/MauiResource.cs @@ -0,0 +1,27 @@ +using Microsoft.Maui.Controls; +using ContentPropertyAttribute = Microsoft.UI.Xaml.Markup.ContentPropertyAttribute; + +namespace Uno.Extensions.Maui; + +[ContentProperty(Name = nameof(Key))] +[MarkupExtensionReturnType(ReturnType = typeof(object))] +public class MauiResource : MauiExtensionBase +{ + public string Key { get; set; } = string.Empty; + + 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/Properties/Resources.Designer.cs b/src/Uno.Extensions.Maui/Properties/Resources.Designer.cs new file mode 100644 index 0000000000..c44f4e433c --- /dev/null +++ b/src/Uno.Extensions.Maui/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/Properties/Resources.resx b/src/Uno.Extensions.Maui/Properties/Resources.resx new file mode 100644 index 0000000000..ea2f1a7e2a --- /dev/null +++ b/src/Uno.Extensions.Maui/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/Uno.Extensions.Maui.WinUI.csproj b/src/Uno.Extensions.Maui/Uno.Extensions.Maui.WinUI.csproj new file mode 100644 index 0000000000..972dad9a92 --- /dev/null +++ b/src/Uno.Extensions.Maui/Uno.Extensions.Maui.WinUI.csproj @@ -0,0 +1,39 @@ + + + + net7.0;net7.0-android;net7.0-ios;net7.0-maccatalyst + $(TargetFrameworks);net7.0-windows10.0.19041 + true + Uno.Extensions.Maui + $(NoWarn);CS1591;NU5104;NU5048;NU1009 + Extensions to embed .NET MAUI controls within your Uno app. + $(DefineConstants);NO_PLATFORM + + + + + + + + + + + + + + True + True + Resources.resx + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + 10.0.17763.0 + $(TargetPlatformMinVersion) + win10-x86;win10-x64;win10-arm64 + + diff --git a/src/Uno.Extensions.Maui/build/Package.props b/src/Uno.Extensions.Maui/build/Package.props new file mode 100644 index 0000000000..163ffc3bf1 --- /dev/null +++ b/src/Uno.Extensions.Maui/build/Package.props @@ -0,0 +1,9 @@ + + + true + false + <_MauiSkipSdkAutoImport>true + false + false + + diff --git a/src/Uno.Extensions.Maui/build/Package.targets b/src/Uno.Extensions.Maui/build/Package.targets new file mode 100644 index 0000000000..d22a48b27b --- /dev/null +++ b/src/Uno.Extensions.Maui/build/Package.targets @@ -0,0 +1,59 @@ + + + + false + + + + + + + + + + + <_MauiImplicitPackageReference Remove="Microsoft.Maui.Resizetizer" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Uno.Extensions.sln b/src/Uno.Extensions.sln index c71d56f88f..f58fa8a5b6 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\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} From 1399eb24ebb1401f589cb4c9f47be0065553fda1 Mon Sep 17 00:00:00 2001 From: Dan Siegel Date: Mon, 5 Jun 2023 16:30:33 -0600 Subject: [PATCH 02/82] chore: adding basic docs for Maui Embedding --- doc/Overview/Maui/MauiOverview.md | 88 ++++++++++++++++++++++++ src/Uno.Extensions.Maui/MauiColor.cs | 2 - src/Uno.Extensions.Maui/MauiThickness.cs | 33 +++++++++ 3 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 doc/Overview/Maui/MauiOverview.md create mode 100644 src/Uno.Extensions.Maui/MauiThickness.cs diff --git a/doc/Overview/Maui/MauiOverview.md b/doc/Overview/Maui/MauiOverview.md new file mode 100644 index 0000000000..87180d3089 --- /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/src/Uno.Extensions.Maui/MauiColor.cs b/src/Uno.Extensions.Maui/MauiColor.cs index 67aae37fd4..b099e5587b 100644 --- a/src/Uno.Extensions.Maui/MauiColor.cs +++ b/src/Uno.Extensions.Maui/MauiColor.cs @@ -26,5 +26,3 @@ protected override void SetValue(View view, Type viewType, Type propertyType, Bi view.SetValue(property, color); } } - - diff --git a/src/Uno.Extensions.Maui/MauiThickness.cs b/src/Uno.Extensions.Maui/MauiThickness.cs new file mode 100644 index 0000000000..329b6bc436 --- /dev/null +++ b/src/Uno.Extensions.Maui/MauiThickness.cs @@ -0,0 +1,33 @@ +namespace Uno.Extensions.Maui; + +[MarkupExtensionReturnType(ReturnType = typeof(Microsoft.Maui.Thickness))] +public class MauiThickness : MarkupExtension +{ + 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") + }; + } +} From cec4a98f9582e2b3b894f52f5a96a2e407b160d0 Mon Sep 17 00:00:00 2001 From: Dan Siegel Date: Thu, 8 Jun 2023 06:32:50 -0600 Subject: [PATCH 03/82] chore: update for mvp spec --- src/Uno.Extensions.Maui/GlobalUsings.cs | 4 ++-- .../Internals/ConversionExtensions.cs | 22 ++++++++++--------- .../Internals/ConversionHelpers.cs | 8 +++---- src/Uno.Extensions.Maui/MauiBinding.cs | 8 +++---- src/Uno.Extensions.Maui/MauiEmbedding.cs | 3 +++ .../Uno.Extensions.Maui.WinUI.csproj | 14 +++++------- 6 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/Uno.Extensions.Maui/GlobalUsings.cs b/src/Uno.Extensions.Maui/GlobalUsings.cs index e62d2bcf98..478718dd08 100644 --- a/src/Uno.Extensions.Maui/GlobalUsings.cs +++ b/src/Uno.Extensions.Maui/GlobalUsings.cs @@ -24,6 +24,6 @@ global using WinUIColor = Windows.UI.Color; global using NativeMauiColor = Microsoft.Maui.Graphics.Color; global using MauiResourceDictionary = Microsoft.Maui.Controls.ResourceDictionary; -global using MauiConverter = Microsoft.Maui.Controls.IValueConverter; -global using WinUIConverter = Microsoft.UI.Xaml.Data.IValueConverter; +global using IMauiConverter = Microsoft.Maui.Controls.IValueConverter; +global using IWinUIConverter = Microsoft.UI.Xaml.Data.IValueConverter; diff --git a/src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs b/src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs index 6080cec2b7..d6dd287622 100644 --- a/src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs +++ b/src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs @@ -25,16 +25,18 @@ public static Microsoft.Maui.Controls.ResourceDictionary ToMauiResources(this Re private static void TryAddValue(ref Microsoft.Maui.Controls.ResourceDictionary resources, object sourceKey, object value) { - 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)) + // 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/Internals/ConversionHelpers.cs b/src/Uno.Extensions.Maui/Internals/ConversionHelpers.cs index a28e5ce4a5..5739f7782c 100644 --- a/src/Uno.Extensions.Maui/Internals/ConversionHelpers.cs +++ b/src/Uno.Extensions.Maui/Internals/ConversionHelpers.cs @@ -14,7 +14,7 @@ internal static class ConversionHelpers int valueAsInt => valueAsInt, double valueAsDouble => valueAsDouble, float valueAsFloat => valueAsFloat, - WinUIConverter converter => new UnoHostConverter(converter), + 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), @@ -42,11 +42,11 @@ private static LayoutOptions GetLayoutOptions(VerticalAlignment alignment) => _ => LayoutOptions.Fill }; - private class UnoHostConverter : MauiConverter + private class UnoHostConverter : IMauiConverter { - private WinUIConverter _converter { get; } + private IWinUIConverter _converter { get; } - public UnoHostConverter(WinUIConverter converter) => _converter = converter; + public UnoHostConverter(IWinUIConverter converter) => _converter = converter; public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => _converter.Convert(value, targetType, parameter, culture.Name); diff --git a/src/Uno.Extensions.Maui/MauiBinding.cs b/src/Uno.Extensions.Maui/MauiBinding.cs index 72bc991834..c1f20e1d36 100644 --- a/src/Uno.Extensions.Maui/MauiBinding.cs +++ b/src/Uno.Extensions.Maui/MauiBinding.cs @@ -25,15 +25,15 @@ protected override void SetValue(View view, Type viewType, Type propertyType, Mi } - MauiConverter? converter = null; - if (Converter is MauiConverter converterAsMauiConverter) + IMauiConverter? converter = null; + if (Converter is IMauiConverter converterAsMauiConverter) { converter = converterAsMauiConverter; } - else if (Converter is WinUIConverter winUIConverter) + else if (Converter is IWinUIConverter winUIConverter) { var value = ConversionHelpers.ToMauiValue(winUIConverter); - if (value is MauiConverter mauiConverter) + if (value is IMauiConverter mauiConverter) { converter = mauiConverter; } diff --git a/src/Uno.Extensions.Maui/MauiEmbedding.cs b/src/Uno.Extensions.Maui/MauiEmbedding.cs index ab2951e0b8..d1edcc1bad 100644 --- a/src/Uno.Extensions.Maui/MauiEmbedding.cs +++ b/src/Uno.Extensions.Maui/MauiEmbedding.cs @@ -51,6 +51,8 @@ public static void UseMauiEmbedding(this Microsoft.UI.Xaml.Application app, Acti } #endif + // 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 @@ -65,4 +67,5 @@ public static MauiAppBuilder MapStyleHandler(this MauiAppBuilder build Interop.MauiInterop.MapStyleHandler(); return builder; } + */ } diff --git a/src/Uno.Extensions.Maui/Uno.Extensions.Maui.WinUI.csproj b/src/Uno.Extensions.Maui/Uno.Extensions.Maui.WinUI.csproj index 972dad9a92..475aac60cd 100644 --- a/src/Uno.Extensions.Maui/Uno.Extensions.Maui.WinUI.csproj +++ b/src/Uno.Extensions.Maui/Uno.Extensions.Maui.WinUI.csproj @@ -1,13 +1,13 @@  - net7.0;net7.0-android;net7.0-ios;net7.0-maccatalyst - $(TargetFrameworks);net7.0-windows10.0.19041 + net6.0;net6.0-android;net6.0-ios;net6.0-maccatalyst + $(TargetFrameworks);net6.0-windows10.0.19041 true Uno.Extensions.Maui $(NoWarn);CS1591;NU5104;NU5048;NU1009 Extensions to embed .NET MAUI controls within your Uno app. - $(DefineConstants);NO_PLATFORM + $(DefineConstants);NO_PLATFORM @@ -31,9 +31,7 @@ - - 10.0.17763.0 - $(TargetPlatformMinVersion) - win10-x86;win10-x64;win10-arm64 - + + + From ee5af2a12485aab93e55cb9609eee79a789f0678 Mon Sep 17 00:00:00 2001 From: Dan Siegel Date: Thu, 8 Jun 2023 14:06:51 -0600 Subject: [PATCH 04/82] chore: add base sample project for Maui Embedding --- samples/MauiEmbedding/.vscode/launch.json | 15 + samples/MauiEmbedding/Directory.Build.props | 55 ++ samples/MauiEmbedding/Directory.Build.targets | 6 + .../MauiEmbedding/Directory.Packages.props | 21 + .../MauiEmbedding/MauiEmbedding-vsmac.slnf | 9 + .../MauiEmbedding.Base/AppHead.xaml | 17 + .../MauiEmbedding.Base/AppHead.xaml.cs | 28 + .../MauiEmbedding.Base/Icons/appconfig.svg | 137 ++++ .../MauiEmbedding.Base/Icons/iconapp.svg | 42 + .../Splash/splash_screen.svg | 137 ++++ .../MauiEmbedding.Base/base.props | 26 + .../Android/AndroidManifest.xml | 4 + .../Android/Assets/AboutAssets.txt | 22 + .../Android/Main.Android.cs | 43 ++ .../Android/MainActivity.Android.cs | 16 + .../Android/Resources/AboutResources.txt | 47 ++ .../Android/Resources/values/Strings.xml | 5 + .../Android/Resources/values/Styles.xml | 22 + .../Android/environment.conf | 2 + .../MacCatalyst/Entitlements.plist | 6 + .../MacCatalyst/Info.plist | 26 + .../MacCatalyst/Main.maccatalyst.cs | 14 + .../LaunchImages.launchimage/Contents.json | 58 ++ .../MauiEmbedding.Mobile.csproj | 78 ++ .../iOS/Entitlements.plist | 6 + .../MauiEmbedding.Mobile/iOS/Info.plist | 43 ++ .../MauiEmbedding.Mobile/iOS/Main.iOS.cs | 14 + .../LaunchImages.launchimage/Contents.json | 58 ++ .../MauiEmbedding.Windows.csproj | 81 ++ .../Package.appxmanifest | 43 ++ .../Resources.lang-en-us.resw | 123 +++ .../MauiEmbedding.Windows/app.manifest | 25 + samples/MauiEmbedding/MauiEmbedding.sln | 718 ++++++++++++++++++ samples/MauiEmbedding/MauiEmbedding/App.cs | 83 ++ .../MauiEmbedding/AppResources.xaml | 14 + .../MauiEmbedding/Assets/Icons/back.svg | 3 + .../MauiEmbedding/Assets/SharedAssets.md | 34 + .../Business/Models/AppConfig.cs | 6 + .../MauiEmbedding/Business/Models/Entity.cs | 3 + .../MauiEmbedding/GlobalUsings.cs | 21 + .../MauiEmbedding/MauiEmbedding.csproj | 87 +++ .../MauiEmbedding/Presentation/MainPage.xaml | 27 + .../Presentation/MainPage.xaml.cs | 9 + .../Presentation/MainViewModel.cs | 30 + .../MauiEmbedding/Presentation/Shell.xaml | 36 + .../MauiEmbedding/Presentation/Shell.xaml.cs | 10 + .../Presentation/ShellViewModel.cs | 18 + .../MauiEmbedding/Strings/en/Resources.resw | 123 +++ .../MauiEmbedding/Strings/es/Resources.resw | 123 +++ .../MauiEmbedding/Strings/fr/Resources.resw | 123 +++ .../Strings/pt-BR/Resources.resw | 123 +++ .../Styles/ColorPaletteOverride.xaml | 65 ++ .../Styles/ColorPaletteOverride.zip | Bin 0 -> 6372 bytes .../Styles/MaterialFontsOverride.xaml | 8 + .../appsettings.development.json | 5 + .../MauiEmbedding/appsettings.json | 13 + samples/MauiEmbedding/global.json | 9 + 57 files changed, 2920 insertions(+) create mode 100644 samples/MauiEmbedding/.vscode/launch.json create mode 100644 samples/MauiEmbedding/Directory.Build.props create mode 100644 samples/MauiEmbedding/Directory.Build.targets create mode 100644 samples/MauiEmbedding/Directory.Packages.props create mode 100644 samples/MauiEmbedding/MauiEmbedding-vsmac.slnf create mode 100644 samples/MauiEmbedding/MauiEmbedding.Base/AppHead.xaml create mode 100644 samples/MauiEmbedding/MauiEmbedding.Base/AppHead.xaml.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding.Base/Icons/appconfig.svg create mode 100644 samples/MauiEmbedding/MauiEmbedding.Base/Icons/iconapp.svg create mode 100644 samples/MauiEmbedding/MauiEmbedding.Base/Splash/splash_screen.svg create mode 100644 samples/MauiEmbedding/MauiEmbedding.Base/base.props create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/Android/AndroidManifest.xml create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Assets/AboutAssets.txt create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Main.Android.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/Android/MainActivity.Android.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/AboutResources.txt create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/values/Strings.xml create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Resources/values/Styles.xml create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/Android/environment.conf create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Entitlements.plist create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Info.plist create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Main.maccatalyst.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Entitlements.plist create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Info.plist create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Main.iOS.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding.Mobile/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json create mode 100644 samples/MauiEmbedding/MauiEmbedding.Windows/MauiEmbedding.Windows.csproj create mode 100644 samples/MauiEmbedding/MauiEmbedding.Windows/Package.appxmanifest create mode 100644 samples/MauiEmbedding/MauiEmbedding.Windows/Resources.lang-en-us.resw create mode 100644 samples/MauiEmbedding/MauiEmbedding.Windows/app.manifest create mode 100644 samples/MauiEmbedding/MauiEmbedding.sln create mode 100644 samples/MauiEmbedding/MauiEmbedding/App.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/AppResources.xaml create mode 100644 samples/MauiEmbedding/MauiEmbedding/Assets/Icons/back.svg create mode 100644 samples/MauiEmbedding/MauiEmbedding/Assets/SharedAssets.md create mode 100644 samples/MauiEmbedding/MauiEmbedding/Business/Models/AppConfig.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/Business/Models/Entity.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/GlobalUsings.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/MainViewModel.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/ShellViewModel.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/Strings/en/Resources.resw create mode 100644 samples/MauiEmbedding/MauiEmbedding/Strings/es/Resources.resw create mode 100644 samples/MauiEmbedding/MauiEmbedding/Strings/fr/Resources.resw create mode 100644 samples/MauiEmbedding/MauiEmbedding/Strings/pt-BR/Resources.resw create mode 100644 samples/MauiEmbedding/MauiEmbedding/Styles/ColorPaletteOverride.xaml create mode 100644 samples/MauiEmbedding/MauiEmbedding/Styles/ColorPaletteOverride.zip create mode 100644 samples/MauiEmbedding/MauiEmbedding/Styles/MaterialFontsOverride.xaml create mode 100644 samples/MauiEmbedding/MauiEmbedding/appsettings.development.json create mode 100644 samples/MauiEmbedding/MauiEmbedding/appsettings.json create mode 100644 samples/MauiEmbedding/global.json 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..8c8dc7544d --- /dev/null +++ b/samples/MauiEmbedding/Directory.Build.props @@ -0,0 +1,55 @@ + + + enable + enable + + portable + True + + true + + $(NoWarn);CA1416;NU1507 + + en + + false + false + false + false + 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..5e57c596de --- /dev/null +++ b/samples/MauiEmbedding/Directory.Packages.props @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/MauiEmbedding/MauiEmbedding-vsmac.slnf b/samples/MauiEmbedding/MauiEmbedding-vsmac.slnf new file mode 100644 index 0000000000..b06785bedd --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding-vsmac.slnf @@ -0,0 +1,9 @@ +{ + "solution": { + "path": "MauiEmbedding.sln", + "projects": [ + "MauiEmbedding.Mobile\\MauiEmbedding.Mobile.csproj", + "MauiEmbedding\\MauiEmbedding.csproj" + ] + } +} 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..c7d92999ea --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/Android/Main.Android.cs @@ -0,0 +1,43 @@ +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; + +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..7e1f95c8dc --- /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..f73041b42f --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj @@ -0,0 +1,78 @@ + + + + net6.0-ios;net6.0-android;net6.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..c565526871 --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding.Windows/MauiEmbedding.Windows.csproj @@ -0,0 +1,81 @@ + + + + WinExe + net6.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/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..77be48f94a --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding.sln @@ -0,0 +1,718 @@ + +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 + Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets + Directory.Packages.props = Directory.Packages.props + 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\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.Toolkit", "..\..\src\Uno.Extensions.Toolkit\Uno.Extensions.Toolkit.csproj", "{954D3074-043E-4943-BAD9-F238C28EE9C9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Uno.Extensions.Toolkit.WinUI", "..\..\src\Uno.Extensions.Toolkit.UI\Uno.Extensions.Toolkit.WinUI.csproj", "{C3010A27-EC90-4042-A035-B8EF5B1EC345}" +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", "..\..\src\Uno.Extensions\Uno.Extensions.csproj", "{6ABBF1A8-EAA7-4917-B779-F86EE1928927}" +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 +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 + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|ARM.ActiveCfg = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|ARM.Build.0 = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|ARM64.Build.0 = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|iPhone.Build.0 = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|x64.ActiveCfg = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|x64.Build.0 = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|x86.ActiveCfg = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Debug|x86.Build.0 = Debug|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|Any CPU.Build.0 = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|ARM.ActiveCfg = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|ARM.Build.0 = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|ARM64.ActiveCfg = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|ARM64.Build.0 = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|iPhone.ActiveCfg = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|iPhone.Build.0 = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|x64.ActiveCfg = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|x64.Build.0 = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|x86.ActiveCfg = Release|Any CPU + {954D3074-043E-4943-BAD9-F238C28EE9C9}.Release|x86.Build.0 = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|ARM.ActiveCfg = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|ARM.Build.0 = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|ARM64.Build.0 = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|iPhone.Build.0 = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|x64.ActiveCfg = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|x64.Build.0 = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|x86.ActiveCfg = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Debug|x86.Build.0 = Debug|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|Any CPU.Build.0 = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|ARM.ActiveCfg = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|ARM.Build.0 = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|ARM64.ActiveCfg = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|ARM64.Build.0 = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|iPhone.ActiveCfg = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|iPhone.Build.0 = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|x64.ActiveCfg = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|x64.Build.0 = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.Release|x86.ActiveCfg = Release|Any CPU + {C3010A27-EC90-4042-A035-B8EF5B1EC345}.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 + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|ARM.ActiveCfg = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|ARM.Build.0 = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|ARM64.Build.0 = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|iPhone.Build.0 = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|x64.ActiveCfg = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|x64.Build.0 = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|x86.ActiveCfg = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Debug|x86.Build.0 = Debug|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|Any CPU.Build.0 = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|ARM.ActiveCfg = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|ARM.Build.0 = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|ARM64.ActiveCfg = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|ARM64.Build.0 = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|iPhone.ActiveCfg = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|iPhone.Build.0 = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|x64.ActiveCfg = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|x64.Build.0 = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.Release|x86.ActiveCfg = Release|Any CPU + {6ABBF1A8-EAA7-4917-B779-F86EE1928927}.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 + 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} + {954D3074-043E-4943-BAD9-F238C28EE9C9} = {9B9F35D5-E6DD-4FC7-9198-F8246D3CE366} + {C3010A27-EC90-4042-A035-B8EF5B1EC345} = {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} + {6ABBF1A8-EAA7-4917-B779-F86EE1928927} = {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} + 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..2ceb93cd0f --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding/App.cs @@ -0,0 +1,83 @@ +namespace MauiEmbedding; + +public class App : Application +{ + protected Window? MainWindow { get; private set; } + protected IHost? Host { get; private set; } + + protected async override void OnLaunched(LaunchActivatedEventArgs args) + { + var builder = this.CreateBuilder(args) + // 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(); + } + + private static void RegisterRoutes(IViewRegistry views, IRouteRegistry routes) + { + views.Register( + new ViewMap(ViewModel: typeof(ShellViewModel)), + new ViewMap() + ); + + routes.Register( + new RouteMap("", View: views.FindByViewModel(), + Nested: new RouteMap[] + { + new RouteMap("Main", 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..07765ebd79 --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj @@ -0,0 +1,87 @@ + + + + $(TargetFrameworks);net6.0-windows10.0.19041 + $(TargetFrameworks);net6.0;net6.0-ios;net6.0-android;net6.0-maccatalyst + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(Filename) + + + + + + + + + + + + + + + + + + + + + + + + + + false + Analyzer + + + + + + + + + + + + + diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml new file mode 100644 index 0000000000..0f4d8d7be3 --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml.cs new file mode 100644 index 0000000000..417e389a00 --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml.cs @@ -0,0 +1,9 @@ +namespace MauiEmbedding.Presentation; + +public sealed partial class MainPage : Page +{ + public MainPage() + { + this.InitializeComponent(); + } +} diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MainViewModel.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainViewModel.cs new file mode 100644 index 0000000000..019fb8eef1 --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainViewModel.cs @@ -0,0 +1,30 @@ +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}"; + GoToSecond = new AsyncRelayCommand(GoToSecondView); + } + public string? Title { get; } + + public ICommand GoToSecond { get; } + + + private async Task GoToSecondView() + { + } + +} diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml new file mode 100644 index 0000000000..73ff15d3d7 --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/Shell.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + 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/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 0000000000000000000000000000000000000000..6bafe9c70d4c5a7285df13d7996b9ee43db48218 GIT binary patch literal 6372 zcmd5>byS;8pAAlNmqKwXP>Q=1NhwfVf;$wK;1Jy1wFOF%;$B>WrBJL$aW4*q;!tEm z_v^mzclO(JR{q&}&LeZ@&hJiUp8Rs=MnwS$nF#Puk_(-*en0%Wk)Ob{+Tzb9#g?b$u)s&gZ7Z?^$00tiU%VdK4gf;Z zWi0lWcJKV;>Ti{WQg9RIr2EQ*!`?hrl~`q*SBKKh7$>gX-U_90%yoV>())DqUk?@M z&rr=B&Hi5vvSq82mH`<6Adm$BaQ_U_((%t!F2032ta0Ln9g52KW&&TK+s%{C5TuNoh!{5a`xuE<>!CK=pd8p)u`Q3DTjaK9@`>Mt5Qp9oRv}8JewL4HI9kqB+Xi zW^fLJO^ARdqLi!Es+wZUhuoTbb{&E%+gOI_&D=)JE89KZ5*TaNoaz<{G6Q6O3&lIP zmmHTuK5x>t?cYr|R~la*z5q;9+=e7F$^_3J<#Pg`+kPjXg-*NRgOuW%yq4E=9F-G_(IC)dObO9_fAO%5j?(Ditr}8`bKc7`5RuzYuOl6G zKV_R_3ST1F9;CO6=Spk2+^s{`Us`9w|5PAm;*@jArI|q@+bD|6m4YNaSXnYb2e1AiFA+ zi)Q2zC_m+T`8j^Uo7Z$w&?FgO17d4Y;sQC_3htXl8~fFL#IW!>T5rcSJ32Lkw;N#N z_3_Wy>^kyL@e#V?*tg6kwE?1}0!j?5>b4YC+D^W2W54>-Tk+uUeP_?ZWE04_PG^Q1 zj&Kk1fzuLpHk0%sF{Zwa%%WgPSV^BQjm^pw2n&DN>Kc!|ea8b2nlnNd#pgznu(g|{ zk-+^dsvM$h29sbW(OmKfO?2GjTYz|rkGbgw`s>kt2aivZ^(QO8oZhKWwlKZsc{Sy$_z@CJKeFj6uy%dd$Ztww z`s*?Nh^+bt*o3W&xd-nx2_xFwzQj92`sa1cHD7kl@~+aP%rC!HL>*sN$x)#l`Xl_6 z_1@GtX*s0C;~AimRiog~Pw+z5RE?aTA<)FnC5m(FSdZU_bAQq!0*E z5!e67a!`5@gtxYsIioagPavwK0Q>5S>sxTI13Rf>9+^zO@v8x~mE*+c;>PFS+(_@^ z?k%2g%=alALVb>mIw~cWzK5@G6~kC1qISVQ%kECaZhSgN1RyVNcfzZbt4RH7J#!C9 z14%=UVDl{A6qeB*hY~D=HDZh$Uhzw@IeBmdEhPAdMr=SK1GT(bR1K?m`^Ck%a6YwYr+dA|w> z!d*K3L~R7zs8hy%J#W3O8r_YVW6HU;2@xQTenq7zKG^vtzBIR`?w}acOKs6#Pum@> zUO)+Vpze@j=iWcb|K1B?AJTe2K@mkG5Trjq%|rvG9jTsVJ}z3YkH7L}J7*~Xmc^Av zutCG@MxUPsm{gNnPsK2kyJy@^o+M>FvUG|KF2F@pD(VJqXo-#RKBY?pH@C3*3*sl6 zc+S=!BOxm}OoPHBO4V!Pq3Es2Z1$>}c9*Q9f+T?^W3&WSD5i?z>an9^V z-2pr&rCiE&qSym|#7v5E!H)VN&(426!Eva#K^vmOA~50%)cMs-?3o7Em@~HAVl9)= zbV1x5Zwqk>%*~3u>@c;Fs-Pz%8ZjTF{D7<(6HSBrPL@ve>$U5br;^5Lg!I49!hQ#^4U?n(MF-<>g3$7Pz|cFrM#Eu^n+n^ zpJQp7hvlq5yM$gR^k~y|@ho{({P!6-wEN*J$FHw4wYR@^b7o6T+kHbYB>BR!p45*9 zYl2W4P^{=D=y8dj9#4hFGsEr)Kuch2=L@O?4)hM|@T85~?z(r_@H34~v}2L%C9{ zZ42Xb+3~S)s_IQZ6HXVbUubB}P2`Wr&g5oWkNQHXY3RJIRCIpkL8MaB7Ov|hc^yP$ zSeFoJ5WVbl#v5BNfjOa&E_&vegVr9HssuR}fT1#B1&G+ffh-w#5Yj{8 z9nI4D(a%(z##UJnam2wvp0KxkNa~U<>{W-#b?^HtbX7z##?gk`VtNa}aXzH&1mV$$ zlbLCEq+&)kuxtXPw=pG)vV8JkcMR(w%7s&Zbn?D9%v4-d#3KP5^4=nx01J;-mfaU> z1mNGC()H+yNk z@^nnvgFLwjW}*1}f#qL!v*rc2kVqHSD2T}A!z*tK=~Lkdn&Ad~h{ocope zK(-u@r?GmJEv38aS%?=-M$9IIV{$dRcI#727wv6L1iS?0rAZjlCo)(5QFNO~s?9+; z26{rFdTZyW!3|cbDTe1=q2$hXPu50izwPG8W@R{n)_CLAqR`Yg2t9sincotj77;D= z*s8mn=R!BK-Tb;zT2^fIP!n#c{C~~mVhWBRnK*iV5WDMq4~5{xQJ~jsOAf|Ron~Md zR~e!T+zYqkTa5-`P8q@+aY*}9pBZu1yuZ5@TAu%PET< zh99zlrY0(dSN8!OQiN2Z`zi9%U^mAMD@9t3mfJi2$!_$zEi9nAN-(+E+@?)kHXvQ^ zWca<#Ag75A26?FYtWlH`);ih%PRbkKybT~;iz2Ejza61XVW2@qDigbO`M!|7XDHNS zn9PpJ7?rJ~AePTkAn=*TzL`y845uwIg{PZUr1AT$0u8+(V9AyMu0`V`E1F(}AqHe} z2dbciDUFc3@gd-w83(DLz=OBQghdks-b!LTt={CWs~Pxjm^Tn>_kIo|bdyQ(AXlIO zRZi$1y<-ZQwL_9UIO0Z}6z14=^>D<&4#WEUOs$-ZldhZfqQd(5OLl!5;~$(gp;+sDV){zoWodsP&;_@9(FY#HQ{Y^zE*4 zEk~@Y@}AKyflXOfH#WSPJD0KLourEI?MEv_CYx3VQM^e$`tq{*L2ABrVQ~Gi=!NH3`A62zzSgHL@fq!i8tE!X z>5^w@Z5o^qSDzH7s*Xo}tzUzt3x-H>ejp|s9~`T%UDb9d$FQvD7S`a*>>Se&#ZsmTqjve9BTI#It-Z+6{g+=JuI2lsxJ4#OeDonc}?#oZ{>GNe< zwQEh`RfF$fOJLHLX2m*p`#X0*AF{B4q*+n=f%DRD&R0uYb9d1fQF7l!xjP04HH3_& zggN%+t;2aDos&pJj~}qi2kgS9=%BM7vZFm@O8@HaK>^?~_rg*(k+|&9^Uv8lJW1@; zHc!&g{3;JRi$&O*zDuMqe{_MCy6N-7e`ZdgvYO6jz$ARFiglN6d667qB@_uuA}&T-Itr;sh2sl4kd{j5gSMYDo;&I+N>g`POc*edTZ_V{hCtaj*iO` zVBAK+L98O|6fnkcy&d#w&IsnV6Yu^mIklczXMIaJ3lLqK^0HeV&Uy}K6^1^rdPkYt zkR9Nxq;5D%sVNo5-+-jR3u>0g^5jJ-ep>80L3f4gWh=KtbZHPVXOe5R9c4PULt&3m zN~CXtybc2W0Lqts=aLmI;p13^OrB=Pw75KZWH{snhu*ea$o689y&?he$0;CsjMEz9 z;X@p{Sk$`UVyGZ_7-82`>37r^x_dT?mqq@C=Q+3b35ksUjcYqiqXL%3x}U|)$`&Of zFcL4P1`}c8DSoRb8M<@04Aw@A{B(QsEa5zqe%qmlRnWw-VFkh-mi6FDknekG2NE) zoeU4KjSbbcCgdUVPbaey5WN}%x;)`MZ0GIM=T&k;h`P(#5xQ&#ZFIddt%Ul;Db50e zJm5h*a0gjEZH_rZS{zkpD$h~JDp`9R4>YM+jJ18}^|cELziHBc)R-Re3p1+=iae&8 z{fSH0TT-QYdFnwG<&{CLh+)UG!aKt%$|_1t!u1I;_Yzvr!;hpCS<(Hz&%Vw^Y7u)F zmx=Eaxs$gYF^B9AZ7%oE@8FyPI48BDyZFmqLNo=F1-yOEj+n~L5Z54Pok{7&c-$%* zp?FMdb$r`_FbWFSVYTO3ah+rJm0t|Mk+B%Jfj55($H+Bwq%ZnhFawWPSJ5pt9YY5WD02u~K|1WR$cS|G^Qz5uu<+LN z!7jQlg^XV5=Z%@{U~#U(>vOzM``d6%r7drc;i+J}O%nmPiQ)-(_+ zUf7b{6T|3%SDT3qJPp}6R9Grpfivak%yex007~~8A0BxelEZ`W((3 zt)1;YcXtc|UKb@zNihF5RGakeiM#hMp7e;~`IB+)%{b9cacKU6CRb(tX&cXLt%fGZ`_6rG7t`(BMHI_~Zzs}PN zX|#^ws3BBLo~eBz&wu8>EELH3ZR#h1Az-7!OOdfJ<5MOH4PhY2X z>=D@3dNeeXt2ob91syRfiH1GaEv%C<__U%6MEYfIsP*#uu%vhTR=W13GZ+E^pUwJY zJhLH{ZLsvpS8>2QlE)zz!!j@;#S@d3TCP6WH-V}Vyctn9J9f()_aU)P31au4OXZ>c zh*NL=O3H$UA$GQ3(40Xqrhs=_3gu}?eU#kxwF-@-R8fqzXrw1qoq3y@$SVvlHJZvA z|0)izd1N*);aMDvtB^HG@y)3{vMYVlWX1^3@aq^dHCc*Z;`mz6Tu+sVG&diYp7Jhk z4_La=EbJPN+WCs*?K8*&9gwNLX+AQ_nQVMybYSRkl>S;2?o%rkp#ZaE(de-58_<)@)heTiIvic z+h~d&{a|?1sK&4mE9ug~;iIB)r+`l&Jr-_`T+`+l%|pZQATdG$A5T?!EWZf$${ zg8LT;$I@G=$q#IY){LmNn}z&JcIu_xqMA>=_1G8-j-8^CVJ0bzfTHL$vTD^}0j!ub1*YtEw&p&xRcYU7z&lL=}j9#XuM9@4wR6 zWgKk8lw zgRZYIeaO>M_R(TbW6U~4yOO8PfA7~Ksahar2O*4r+EggC8cmTHkzP0Qh|fs9u@c0G zcpus)X6TUO+=xgnn_h#|csn?K0P#`9m=k|BOA1QQzhwu=-h*+Bo8owgGbvhM%ld45 zc9ZN*F0$%2^5zY%k-xUM^ z832%bT4W8HMfeT;?ebUHf8}KV2^#?KK@UIwm9PDORlx!LU1j8t%70kW|C{*#>>vL< zJ{Ud&zdyxaZu0+B;6M9Ge*|dYgYSj^MetkTZ|>6H6&m99y4?O73-Qkx^p8RST!EJm euJDh1`uE8H^%A3?!n*-b;fF9H0FXlRQ2RF?*;QKr literal 0 HcmV?d00001 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/global.json b/samples/MauiEmbedding/global.json new file mode 100644 index 0000000000..16afecfd72 --- /dev/null +++ b/samples/MauiEmbedding/global.json @@ -0,0 +1,9 @@ +{ + "sdk": { + "version": "6.0.408", + "allowPrerelease": false + }, + "msbuild-sdks": { + "MSBuild.Sdk.Extras": "3.0.44" + } +} From f13d36313b5b21b9bbef26536091c34de1e4ba00 Mon Sep 17 00:00:00 2001 From: Dan Siegel Date: Thu, 8 Jun 2023 14:07:16 -0600 Subject: [PATCH 05/82] chore: cleanup Maui Embedding Targets --- src/Uno.Extensions.Maui/build/Package.targets | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Uno.Extensions.Maui/build/Package.targets b/src/Uno.Extensions.Maui/build/Package.targets index d22a48b27b..3c9fe37500 100644 --- a/src/Uno.Extensions.Maui/build/Package.targets +++ b/src/Uno.Extensions.Maui/build/Package.targets @@ -3,6 +3,11 @@ false + + + + + @@ -14,7 +19,7 @@ <_MauiImplicitPackageReference Remove="Microsoft.Maui.Resizetizer" /> - + @@ -25,13 +30,13 @@ - + + MatchExpression="that.class" + ReplacementText="that.@class" + Condition="Exists('$(IntermediateOutputPath)XamlTypeInfo.g.cs')" /> From 9afa41e2331d4cd3c20ed977b4a73f14236d0bdf Mon Sep 17 00:00:00 2001 From: Dan Siegel Date: Mon, 12 Jun 2023 08:47:58 -0600 Subject: [PATCH 06/82] chore: updating sample --- .../MauiEmbedding/Presentation/MainPage.xaml | 25 +++++++++++++++++++ .../Presentation/TitleConverter.cs | 9 +++++++ 2 files changed, 34 insertions(+) create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/TitleConverter.cs diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml index 0f4d8d7be3..c18e004c03 100644 --- a/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml +++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml @@ -7,9 +7,19 @@ mc:Ignorable="d" xmlns:uen="using:Uno.Extensions.Navigation.UI" xmlns:utu="using:Uno.Toolkit.UI" + xmlns:embed="using:Uno.Extensions.Maui" + xmlns:maui="using:Microsoft.Maui.Controls" NavigationCacheMode="Required" Background="{ThemeResource BackgroundBrush}"> + + + Hello from WinUI Resources + #169420 + + + + @@ -17,6 +27,21 @@ + + + + + + + + + + + + $"Converted: {value}"; + public object ConvertBack(object? value, Type targetType, object parameter, string language) => Regex.Replace(value?.ToString() ?? string.Empty, "(Converted: )", string.Empty); +} From 8b7712990eb4b8db4388174ede187396792d6495 Mon Sep 17 00:00:00 2001 From: Pedro Jesus Date: Mon, 12 Jun 2023 16:22:58 -0300 Subject: [PATCH 07/82] chore: updated Resizetizer package and add UseMauiEmbedding call --- samples/MauiEmbedding/Directory.Packages.props | 4 ++-- samples/MauiEmbedding/MauiEmbedding/App.cs | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/samples/MauiEmbedding/Directory.Packages.props b/samples/MauiEmbedding/Directory.Packages.props index 5e57c596de..4e338ee3be 100644 --- a/samples/MauiEmbedding/Directory.Packages.props +++ b/samples/MauiEmbedding/Directory.Packages.props @@ -12,10 +12,10 @@ - + - + \ No newline at end of file diff --git a/samples/MauiEmbedding/MauiEmbedding/App.cs b/samples/MauiEmbedding/MauiEmbedding/App.cs index 2ceb93cd0f..ee808ab04b 100644 --- a/samples/MauiEmbedding/MauiEmbedding/App.cs +++ b/samples/MauiEmbedding/MauiEmbedding/App.cs @@ -8,6 +8,7 @@ public class App : Application protected async override void OnLaunched(LaunchActivatedEventArgs args) { var builder = this.CreateBuilder(args) + .UseMauiEmbedding() // Add navigation support for toolkit controls such as TabBar and NavigationView .UseToolkitNavigation() .Configure(host => host From 183e6438c949acc20478879a263c44acad0ec23b Mon Sep 17 00:00:00 2001 From: Nick Randolph Date: Tue, 13 Jun 2023 16:13:16 +1000 Subject: [PATCH 08/82] chore: Removing 6x sdk --- samples/MauiEmbedding/global.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/samples/MauiEmbedding/global.json b/samples/MauiEmbedding/global.json index 16afecfd72..0385fde5c2 100644 --- a/samples/MauiEmbedding/global.json +++ b/samples/MauiEmbedding/global.json @@ -1,8 +1,4 @@ { - "sdk": { - "version": "6.0.408", - "allowPrerelease": false - }, "msbuild-sdks": { "MSBuild.Sdk.Extras": "3.0.44" } From 1ab9252d6a85934d0d0a460fd2056ea7261ec61e Mon Sep 17 00:00:00 2001 From: Nick Randolph Date: Tue, 13 Jun 2023 16:13:30 +1000 Subject: [PATCH 09/82] chore: Adding solution items --- samples/MauiEmbedding/MauiEmbedding.sln | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/MauiEmbedding/MauiEmbedding.sln b/samples/MauiEmbedding/MauiEmbedding.sln index 77be48f94a..4aff965a90 100644 --- a/samples/MauiEmbedding/MauiEmbedding.sln +++ b/samples/MauiEmbedding/MauiEmbedding.sln @@ -15,9 +15,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiEmbedding.Windows", "Ma 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}" From d34e0698f0d9f3d237d6bbde0f0bcc6f764aee7d Mon Sep 17 00:00:00 2001 From: Nick Randolph Date: Tue, 13 Jun 2023 16:13:47 +1000 Subject: [PATCH 10/82] chore: Adding missing windows files --- .../PublishProfiles/win10-arm64.pubxml | 20 +++++++++++++++++++ .../PublishProfiles/win10-x64.pubxml | 20 +++++++++++++++++++ .../PublishProfiles/win10-x86.pubxml | 20 +++++++++++++++++++ .../Properties/launchSettings.json | 7 +++++++ 4 files changed, 67 insertions(+) create mode 100644 samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-arm64.pubxml create mode 100644 samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-x64.pubxml create mode 100644 samples/MauiEmbedding/MauiEmbedding.Windows/Properties/PublishProfiles/win10-x86.pubxml create mode 100644 samples/MauiEmbedding/MauiEmbedding.Windows/Properties/launchSettings.json 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" + } + } +} From 48137a96978709b1424bb938cdca1e76f855b9e8 Mon Sep 17 00:00:00 2001 From: Nick Randolph Date: Tue, 13 Jun 2023 16:28:04 +1000 Subject: [PATCH 11/82] chore: Correcting directory name --- .../MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj | 4 ++-- .../MauiEmbedding.Windows/MauiEmbedding.Windows.csproj | 4 ++-- samples/MauiEmbedding/MauiEmbedding.sln | 2 +- samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj | 6 +++--- .../GlobalUsings.cs | 0 .../Internals/ConversionExtensions.cs | 0 .../Internals/ConversionHelpers.cs | 0 .../Internals/UnoHost.cs | 0 .../Internals/UnoMauiEmbeddingInitializer.cs | 0 .../Interop/IWinUIToMauiStyleHandler.cs | 0 .../Interop/LabelStyleHandler.cs | 0 .../Interop/LayoutStyleHandler.cs | 0 .../Interop/MauiInterop.cs | 0 .../Interop/ViewStyleHandler.cs | 0 .../Interop/VisualElementStyleHandler.cs | 0 .../Interop/WinUIToMauiStyleHandler.cs | 0 .../MauiBinding.cs | 0 .../MauiColor.cs | 0 .../MauiContent.cs | 0 .../MauiEmbedding.cs | 0 .../MauiEmbeddingException.cs | 0 .../MauiEmbeddingInitializationException.cs | 0 .../MauiExtensionBase.cs | 0 .../MauiResource.cs | 0 .../MauiThickness.cs | 0 .../Properties/Resources.Designer.cs | 0 .../Properties/Resources.resx | 0 .../Uno.Extensions.Maui.WinUI.csproj | 0 .../build/Package.props | 0 .../build/Package.targets | 0 src/Uno.Extensions.sln | 2 +- 31 files changed, 9 insertions(+), 9 deletions(-) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/GlobalUsings.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Internals/ConversionExtensions.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Internals/ConversionHelpers.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Internals/UnoHost.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Internals/UnoMauiEmbeddingInitializer.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Interop/IWinUIToMauiStyleHandler.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Interop/LabelStyleHandler.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Interop/LayoutStyleHandler.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Interop/MauiInterop.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Interop/ViewStyleHandler.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Interop/VisualElementStyleHandler.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Interop/WinUIToMauiStyleHandler.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/MauiBinding.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/MauiColor.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/MauiContent.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/MauiEmbedding.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/MauiEmbeddingException.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/MauiEmbeddingInitializationException.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/MauiExtensionBase.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/MauiResource.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/MauiThickness.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Properties/Resources.Designer.cs (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Properties/Resources.resx (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/Uno.Extensions.Maui.WinUI.csproj (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/build/Package.props (100%) rename src/{Uno.Extensions.Maui => Uno.Extensions.Maui.UI}/build/Package.targets (100%) diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj b/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj index f73041b42f..e98d352aa7 100644 --- a/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj +++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj @@ -1,5 +1,5 @@ - + net6.0-ios;net6.0-android;net6.0-maccatalyst true @@ -74,5 +74,5 @@ - + diff --git a/samples/MauiEmbedding/MauiEmbedding.Windows/MauiEmbedding.Windows.csproj b/samples/MauiEmbedding/MauiEmbedding.Windows/MauiEmbedding.Windows.csproj index c565526871..bbcae29a4f 100644 --- a/samples/MauiEmbedding/MauiEmbedding.Windows/MauiEmbedding.Windows.csproj +++ b/samples/MauiEmbedding/MauiEmbedding.Windows/MauiEmbedding.Windows.csproj @@ -1,5 +1,5 @@ - + WinExe net6.0-windows10.0.19041.0 @@ -77,5 +77,5 @@ - + diff --git a/samples/MauiEmbedding/MauiEmbedding.sln b/samples/MauiEmbedding/MauiEmbedding.sln index 4aff965a90..4f99c19724 100644 --- a/samples/MauiEmbedding/MauiEmbedding.sln +++ b/samples/MauiEmbedding/MauiEmbedding.sln @@ -24,7 +24,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution 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\Uno.Extensions.Maui.WinUI.csproj", "{E979B964-15B6-47A1-9ABC-7A2CAB2286E9}" +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 diff --git a/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj b/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj index 07765ebd79..7629155874 100644 --- a/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj +++ b/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj @@ -1,5 +1,5 @@  - + $(TargetFrameworks);net6.0-windows10.0.19041 $(TargetFrameworks);net6.0;net6.0-ios;net6.0-android;net6.0-maccatalyst @@ -66,7 +66,7 @@ - + @@ -81,7 +81,7 @@ - + diff --git a/src/Uno.Extensions.Maui/GlobalUsings.cs b/src/Uno.Extensions.Maui.UI/GlobalUsings.cs similarity index 100% rename from src/Uno.Extensions.Maui/GlobalUsings.cs rename to src/Uno.Extensions.Maui.UI/GlobalUsings.cs diff --git a/src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs b/src/Uno.Extensions.Maui.UI/Internals/ConversionExtensions.cs similarity index 100% rename from src/Uno.Extensions.Maui/Internals/ConversionExtensions.cs rename to src/Uno.Extensions.Maui.UI/Internals/ConversionExtensions.cs diff --git a/src/Uno.Extensions.Maui/Internals/ConversionHelpers.cs b/src/Uno.Extensions.Maui.UI/Internals/ConversionHelpers.cs similarity index 100% rename from src/Uno.Extensions.Maui/Internals/ConversionHelpers.cs rename to src/Uno.Extensions.Maui.UI/Internals/ConversionHelpers.cs diff --git a/src/Uno.Extensions.Maui/Internals/UnoHost.cs b/src/Uno.Extensions.Maui.UI/Internals/UnoHost.cs similarity index 100% rename from src/Uno.Extensions.Maui/Internals/UnoHost.cs rename to src/Uno.Extensions.Maui.UI/Internals/UnoHost.cs diff --git a/src/Uno.Extensions.Maui/Internals/UnoMauiEmbeddingInitializer.cs b/src/Uno.Extensions.Maui.UI/Internals/UnoMauiEmbeddingInitializer.cs similarity index 100% rename from src/Uno.Extensions.Maui/Internals/UnoMauiEmbeddingInitializer.cs rename to src/Uno.Extensions.Maui.UI/Internals/UnoMauiEmbeddingInitializer.cs diff --git a/src/Uno.Extensions.Maui/Interop/IWinUIToMauiStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/IWinUIToMauiStyleHandler.cs similarity index 100% rename from src/Uno.Extensions.Maui/Interop/IWinUIToMauiStyleHandler.cs rename to src/Uno.Extensions.Maui.UI/Interop/IWinUIToMauiStyleHandler.cs diff --git a/src/Uno.Extensions.Maui/Interop/LabelStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/LabelStyleHandler.cs similarity index 100% rename from src/Uno.Extensions.Maui/Interop/LabelStyleHandler.cs rename to src/Uno.Extensions.Maui.UI/Interop/LabelStyleHandler.cs diff --git a/src/Uno.Extensions.Maui/Interop/LayoutStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/LayoutStyleHandler.cs similarity index 100% rename from src/Uno.Extensions.Maui/Interop/LayoutStyleHandler.cs rename to src/Uno.Extensions.Maui.UI/Interop/LayoutStyleHandler.cs diff --git a/src/Uno.Extensions.Maui/Interop/MauiInterop.cs b/src/Uno.Extensions.Maui.UI/Interop/MauiInterop.cs similarity index 100% rename from src/Uno.Extensions.Maui/Interop/MauiInterop.cs rename to src/Uno.Extensions.Maui.UI/Interop/MauiInterop.cs diff --git a/src/Uno.Extensions.Maui/Interop/ViewStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/ViewStyleHandler.cs similarity index 100% rename from src/Uno.Extensions.Maui/Interop/ViewStyleHandler.cs rename to src/Uno.Extensions.Maui.UI/Interop/ViewStyleHandler.cs diff --git a/src/Uno.Extensions.Maui/Interop/VisualElementStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/VisualElementStyleHandler.cs similarity index 100% rename from src/Uno.Extensions.Maui/Interop/VisualElementStyleHandler.cs rename to src/Uno.Extensions.Maui.UI/Interop/VisualElementStyleHandler.cs diff --git a/src/Uno.Extensions.Maui/Interop/WinUIToMauiStyleHandler.cs b/src/Uno.Extensions.Maui.UI/Interop/WinUIToMauiStyleHandler.cs similarity index 100% rename from src/Uno.Extensions.Maui/Interop/WinUIToMauiStyleHandler.cs rename to src/Uno.Extensions.Maui.UI/Interop/WinUIToMauiStyleHandler.cs diff --git a/src/Uno.Extensions.Maui/MauiBinding.cs b/src/Uno.Extensions.Maui.UI/MauiBinding.cs similarity index 100% rename from src/Uno.Extensions.Maui/MauiBinding.cs rename to src/Uno.Extensions.Maui.UI/MauiBinding.cs diff --git a/src/Uno.Extensions.Maui/MauiColor.cs b/src/Uno.Extensions.Maui.UI/MauiColor.cs similarity index 100% rename from src/Uno.Extensions.Maui/MauiColor.cs rename to src/Uno.Extensions.Maui.UI/MauiColor.cs diff --git a/src/Uno.Extensions.Maui/MauiContent.cs b/src/Uno.Extensions.Maui.UI/MauiContent.cs similarity index 100% rename from src/Uno.Extensions.Maui/MauiContent.cs rename to src/Uno.Extensions.Maui.UI/MauiContent.cs diff --git a/src/Uno.Extensions.Maui/MauiEmbedding.cs b/src/Uno.Extensions.Maui.UI/MauiEmbedding.cs similarity index 100% rename from src/Uno.Extensions.Maui/MauiEmbedding.cs rename to src/Uno.Extensions.Maui.UI/MauiEmbedding.cs diff --git a/src/Uno.Extensions.Maui/MauiEmbeddingException.cs b/src/Uno.Extensions.Maui.UI/MauiEmbeddingException.cs similarity index 100% rename from src/Uno.Extensions.Maui/MauiEmbeddingException.cs rename to src/Uno.Extensions.Maui.UI/MauiEmbeddingException.cs diff --git a/src/Uno.Extensions.Maui/MauiEmbeddingInitializationException.cs b/src/Uno.Extensions.Maui.UI/MauiEmbeddingInitializationException.cs similarity index 100% rename from src/Uno.Extensions.Maui/MauiEmbeddingInitializationException.cs rename to src/Uno.Extensions.Maui.UI/MauiEmbeddingInitializationException.cs diff --git a/src/Uno.Extensions.Maui/MauiExtensionBase.cs b/src/Uno.Extensions.Maui.UI/MauiExtensionBase.cs similarity index 100% rename from src/Uno.Extensions.Maui/MauiExtensionBase.cs rename to src/Uno.Extensions.Maui.UI/MauiExtensionBase.cs diff --git a/src/Uno.Extensions.Maui/MauiResource.cs b/src/Uno.Extensions.Maui.UI/MauiResource.cs similarity index 100% rename from src/Uno.Extensions.Maui/MauiResource.cs rename to src/Uno.Extensions.Maui.UI/MauiResource.cs diff --git a/src/Uno.Extensions.Maui/MauiThickness.cs b/src/Uno.Extensions.Maui.UI/MauiThickness.cs similarity index 100% rename from src/Uno.Extensions.Maui/MauiThickness.cs rename to src/Uno.Extensions.Maui.UI/MauiThickness.cs diff --git a/src/Uno.Extensions.Maui/Properties/Resources.Designer.cs b/src/Uno.Extensions.Maui.UI/Properties/Resources.Designer.cs similarity index 100% rename from src/Uno.Extensions.Maui/Properties/Resources.Designer.cs rename to src/Uno.Extensions.Maui.UI/Properties/Resources.Designer.cs diff --git a/src/Uno.Extensions.Maui/Properties/Resources.resx b/src/Uno.Extensions.Maui.UI/Properties/Resources.resx similarity index 100% rename from src/Uno.Extensions.Maui/Properties/Resources.resx rename to src/Uno.Extensions.Maui.UI/Properties/Resources.resx diff --git a/src/Uno.Extensions.Maui/Uno.Extensions.Maui.WinUI.csproj b/src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj similarity index 100% rename from src/Uno.Extensions.Maui/Uno.Extensions.Maui.WinUI.csproj rename to src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj diff --git a/src/Uno.Extensions.Maui/build/Package.props b/src/Uno.Extensions.Maui.UI/build/Package.props similarity index 100% rename from src/Uno.Extensions.Maui/build/Package.props rename to src/Uno.Extensions.Maui.UI/build/Package.props diff --git a/src/Uno.Extensions.Maui/build/Package.targets b/src/Uno.Extensions.Maui.UI/build/Package.targets similarity index 100% rename from src/Uno.Extensions.Maui/build/Package.targets rename to src/Uno.Extensions.Maui.UI/build/Package.targets diff --git a/src/Uno.Extensions.sln b/src/Uno.Extensions.sln index f58fa8a5b6..c9f6c2766f 100644 --- a/src/Uno.Extensions.sln +++ b/src/Uno.Extensions.sln @@ -190,7 +190,7 @@ 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\Uno.Extensions.Maui.WinUI.csproj", "{D2F84DF8-C3BF-4FA2-B378-6AEDD6B6C350}" +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 From 6efa82c1e886ab0ef5fb880b375fec0b41e199bd Mon Sep 17 00:00:00 2001 From: Nick Randolph Date: Tue, 13 Jun 2023 16:34:19 +1000 Subject: [PATCH 12/82] chore: Enabling xml docs warnings --- src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj b/src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj index 475aac60cd..85c2d5529a 100644 --- a/src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj +++ b/src/Uno.Extensions.Maui.UI/Uno.Extensions.Maui.WinUI.csproj @@ -5,7 +5,7 @@ $(TargetFrameworks);net6.0-windows10.0.19041 true Uno.Extensions.Maui - $(NoWarn);CS1591;NU5104;NU5048;NU1009 + $(NoWarn);NU5104;NU5048;NU1009 Extensions to embed .NET MAUI controls within your Uno app. $(DefineConstants);NO_PLATFORM From 7acc6ad747449d622606db8d93c4f9ed8f596809 Mon Sep 17 00:00:00 2001 From: Pedro Jesus Date: Tue, 13 Jun 2023 16:55:03 -0300 Subject: [PATCH 13/82] docs: added inline docs for public members --- src/Uno.Extensions.Maui.UI/MauiBinding.cs | 22 +++++++++++++ src/Uno.Extensions.Maui.UI/MauiColor.cs | 8 +++++ src/Uno.Extensions.Maui.UI/MauiContent.cs | 24 ++++++++++---- src/Uno.Extensions.Maui.UI/MauiEmbedding.cs | 19 ++++++++++++ .../MauiEmbeddingException.cs | 14 +++++++++ .../MauiEmbeddingInitializationException.cs | 9 ++++++ .../MauiExtensionBase.cs | 31 ++++++++++++++++--- src/Uno.Extensions.Maui.UI/MauiResource.cs | 14 +++++++++ src/Uno.Extensions.Maui.UI/MauiThickness.cs | 7 +++++ 9 files changed, 138 insertions(+), 10 deletions(-) diff --git a/src/Uno.Extensions.Maui.UI/MauiBinding.cs b/src/Uno.Extensions.Maui.UI/MauiBinding.cs index c1f20e1d36..acddbb9d1a 100644 --- a/src/Uno.Extensions.Maui.UI/MauiBinding.cs +++ b/src/Uno.Extensions.Maui.UI/MauiBinding.cs @@ -2,21 +2,43 @@ 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)) diff --git a/src/Uno.Extensions.Maui.UI/MauiColor.cs b/src/Uno.Extensions.Maui.UI/MauiColor.cs index b099e5587b..ea49eb73a1 100644 --- a/src/Uno.Extensions.Maui.UI/MauiColor.cs +++ b/src/Uno.Extensions.Maui.UI/MauiColor.cs @@ -2,11 +2,19 @@ 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)) diff --git a/src/Uno.Extensions.Maui.UI/MauiContent.cs b/src/Uno.Extensions.Maui.UI/MauiContent.cs index d05a832aad..ce38007b5d 100644 --- a/src/Uno.Extensions.Maui.UI/MauiContent.cs +++ b/src/Uno.Extensions.Maui.UI/MauiContent.cs @@ -5,12 +5,18 @@ 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) @@ -18,7 +24,7 @@ private static void OnViewChanged(DependencyObject dependencyObject, DependencyP return; } - if(embeddedView._host is not null) + if (embeddedView._host is not null) { view.Parent = embeddedView._host; } @@ -41,7 +47,7 @@ private static void OnViewChanged(DependencyObject dependencyObject, DependencyP throw new MauiEmbeddingException(Properties.Resources.UnexpectedErrorConvertingMauiViewToNativeView, ex); } } - + private static ILogger GetLogger() => MauiEmbedding.MauiContext.Services.GetRequiredService>(); @@ -49,12 +55,18 @@ private static ILogger GetLogger() => private readonly IMauiContext MauiContext; + /// + /// Initializes a new instance of the MauiContent class. + /// public MauiContent() { MauiContext = MauiEmbedding.MauiContext; Loading += OnLoading; } + /// + /// Gets or sets the that will be used as content. + /// public View View { get => (View)GetValue(ViewProperty); @@ -66,11 +78,11 @@ private void OnLoading(FrameworkElement sender, object args) Loading -= OnLoading; DependencyObject? treeElement = this; var resources = new ResourceDictionary(); - while(treeElement is not null) + while (treeElement is not null) { - if(treeElement is FrameworkElement element && element.Resources.Any()) + if (treeElement is FrameworkElement element && element.Resources.Any()) { - foreach((var key, var value) in element.Resources) + foreach ((var key, var value) in element.Resources) { if (resources.ContainsKey(key)) { diff --git a/src/Uno.Extensions.Maui.UI/MauiEmbedding.cs b/src/Uno.Extensions.Maui.UI/MauiEmbedding.cs index d1edcc1bad..9a326cc6ca 100644 --- a/src/Uno.Extensions.Maui.UI/MauiEmbedding.cs +++ b/src/Uno.Extensions.Maui.UI/MauiEmbedding.cs @@ -5,6 +5,9 @@ namespace Uno.Extensions.Maui; +/// +/// Embedding support for Microsoft.Maui controls in Uno Platform app hosts. +/// public static class MauiEmbedding { #if !NO_PLATFORM @@ -21,6 +24,12 @@ public static class MauiEmbedding : 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); @@ -28,11 +37,21 @@ public static IApplicationBuilder UseMauiEmbedding(this IApplicationBuilder buil } #if NO_PLATFORM + /// + /// Not supported platform. + /// + /// The Uno app. + /// Optional lambda to configure the Maui app builder. public static void UseMauiEmbedding(this Microsoft.UI.Xaml.Application app, Action? configure = null) { throw new PlatformNotSupportedException(); } #else + /// + /// 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() diff --git a/src/Uno.Extensions.Maui.UI/MauiEmbeddingException.cs b/src/Uno.Extensions.Maui.UI/MauiEmbeddingException.cs index f3907e56be..5b0a600147 100644 --- a/src/Uno.Extensions.Maui.UI/MauiEmbeddingException.cs +++ b/src/Uno.Extensions.Maui.UI/MauiEmbeddingException.cs @@ -1,12 +1,26 @@ 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 index da81efaee8..c92c14c84a 100644 --- a/src/Uno.Extensions.Maui.UI/MauiEmbeddingInitializationException.cs +++ b/src/Uno.Extensions.Maui.UI/MauiEmbeddingInitializationException.cs @@ -1,9 +1,18 @@ 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 index 9d4064a12f..bcdfd54414 100644 --- a/src/Uno.Extensions.Maui.UI/MauiExtensionBase.cs +++ b/src/Uno.Extensions.Maui.UI/MauiExtensionBase.cs @@ -1,14 +1,24 @@ -using System.Reflection; +using System.Numerics; +using System.Reflection; using Microsoft.Extensions.Logging; using Microsoft.Maui.Controls; +using Microsoft.UI.Xaml.Documents; 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)); @@ -58,16 +68,29 @@ void OnParented(object? sender, EventArgs args) return base.ProvideValue(serviceProvider); } - + private ILogger GetLogger() { var factory = MauiEmbedding.MauiContext.Services.GetRequiredService(); - var implemenatingType = GetType(); - return factory.CreateLogger(implemenatingType.Name); + 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 index e9d3d4de9c..571fdbcb92 100644 --- a/src/Uno.Extensions.Maui.UI/MauiResource.cs +++ b/src/Uno.Extensions.Maui.UI/MauiResource.cs @@ -3,12 +3,26 @@ 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)) diff --git a/src/Uno.Extensions.Maui.UI/MauiThickness.cs b/src/Uno.Extensions.Maui.UI/MauiThickness.cs index 329b6bc436..2eaa4308fe 100644 --- a/src/Uno.Extensions.Maui.UI/MauiThickness.cs +++ b/src/Uno.Extensions.Maui.UI/MauiThickness.cs @@ -1,10 +1,17 @@ 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)) From 14591921b84c263d2c9fa732997c32e9494678f7 Mon Sep 17 00:00:00 2001 From: Pedro Jesus Date: Wed, 14 Jun 2023 14:50:50 -0300 Subject: [PATCH 14/82] feat: added mct to the project --- samples/MauiEmbedding/Directory.Packages.props | 1 + .../MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj | 1 + samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj | 1 + 3 files changed, 3 insertions(+) diff --git a/samples/MauiEmbedding/Directory.Packages.props b/samples/MauiEmbedding/Directory.Packages.props index 4e338ee3be..81110efc80 100644 --- a/samples/MauiEmbedding/Directory.Packages.props +++ b/samples/MauiEmbedding/Directory.Packages.props @@ -17,5 +17,6 @@ + \ No newline at end of file diff --git a/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj b/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj index e98d352aa7..1d443e4227 100644 --- a/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj +++ b/samples/MauiEmbedding/MauiEmbedding.Mobile/MauiEmbedding.Mobile.csproj @@ -30,6 +30,7 @@ + diff --git a/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj b/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj index 7629155874..88fe849cfd 100644 --- a/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj +++ b/samples/MauiEmbedding/MauiEmbedding/MauiEmbedding.csproj @@ -17,6 +17,7 @@ + From 4912a89f2ad4f120ace0ce86bf5fda5faf55adb8 Mon Sep 17 00:00:00 2001 From: Pedro Jesus Date: Wed, 14 Jun 2023 14:51:17 -0300 Subject: [PATCH 15/82] feat: created new sample pages --- samples/MauiEmbedding/MauiEmbedding/App.cs | 15 ++++- .../Presentation/MCTControlsPage.xaml | 62 +++++++++++++++++++ .../Presentation/MCTControlsPage.xaml.cs | 28 +++++++++ .../Presentation/MCTControlsViewModel.cs | 11 ++++ .../MauiEmbedding/Presentation/MainPage.xaml | 56 ++++------------- .../Presentation/MainPage.xaml.cs | 3 + .../Presentation/MainViewModel.cs | 11 ++-- .../Presentation/MauiControlsPage.xaml | 52 ++++++++++++++++ .../Presentation/MauiControlsPage.xaml.cs | 28 +++++++++ .../Presentation/MauiControlsViewModel.cs | 20 ++++++ .../MauiEmbedding/Presentation/Shell.xaml | 33 +++++----- 11 files changed, 253 insertions(+), 66 deletions(-) create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsViewModel.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsPage.xaml create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsPage.xaml.cs create mode 100644 samples/MauiEmbedding/MauiEmbedding/Presentation/MauiControlsViewModel.cs diff --git a/samples/MauiEmbedding/MauiEmbedding/App.cs b/samples/MauiEmbedding/MauiEmbedding/App.cs index ee808ab04b..93c7260f81 100644 --- a/samples/MauiEmbedding/MauiEmbedding/App.cs +++ b/samples/MauiEmbedding/MauiEmbedding/App.cs @@ -1,3 +1,6 @@ +using CommunityToolkit.Maui; +using Uno.Extensions.Navigation; + namespace MauiEmbedding; public class App : Application @@ -5,10 +8,14 @@ public class App : Application protected Window? MainWindow { get; private set; } protected IHost? Host { get; private set; } + protected async override void OnLaunched(LaunchActivatedEventArgs args) { var builder = this.CreateBuilder(args) - .UseMauiEmbedding() + .UseMauiEmbedding(maui => + { + maui.UseMauiCommunityToolkit(); + }) // Add navigation support for toolkit controls such as TabBar and NavigationView .UseToolkitNavigation() .Configure(host => host @@ -69,7 +76,9 @@ private static void RegisterRoutes(IViewRegistry views, IRouteRegistry routes) { views.Register( new ViewMap(ViewModel: typeof(ShellViewModel)), - new ViewMap() + new ViewMap(), + new ViewMap(), + new ViewMap() ); routes.Register( @@ -77,6 +86,8 @@ private static void RegisterRoutes(IViewRegistry views, IRouteRegistry routes) Nested: new RouteMap[] { new RouteMap("Main", View: views.FindByViewModel()), + new RouteMap(nameof(MauiControlsViewModel), View: views.FindByViewModel()), + new RouteMap(nameof(MCTControlsViewModel), View: views.FindByViewModel()), } ) ); diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml new file mode 100644 index 0000000000..5621fe0753 --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml.cs b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.xaml.cs new file mode 100644 index 0000000000..d03920bc3b --- /dev/null +++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MCTControlsPage.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 MCTControlsPage : Page +{ + public MCTControlsPage() + { + this.InitializeComponent(); + } +} 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 index c18e004c03..b658a79d30 100644 --- a/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml +++ b/samples/MauiEmbedding/MauiEmbedding/Presentation/MainPage.xaml @@ -1,52 +1,18 @@ - + Background="{ThemeResource BackgroundBrush}" + mc:Ignorable="d"> - - - Hello from WinUI Resources - #169420 - - - + +