From 9cf424ac68924c523340a3aa22fb1bc36dfe065a Mon Sep 17 00:00:00 2001 From: Harvinder Singh Date: Mon, 23 Aug 2021 00:16:05 +1000 Subject: [PATCH 1/4] Added support for WinUI3 desktop --- .gitignore | 3 +- src/ReactiveUI.Uwp/Common/RoutedViewHost.cs | 8 +- .../Common/ViewModelViewHost.cs | 10 +- .../ActivationForViewFetcher.cs | 58 +++ .../DispatcherQueueScheduler.cs | 211 +++++++++++ src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj | 29 ++ src/ReactiveUI.WinUI/Registrations.cs | 45 +++ .../TransitioningContentControl.Empty.cs | 19 + src/ReactiveUI.sln | 343 +++++++++++++++++- src/ReactiveUI/Properties/AssemblyInfo.cs | 1 + 10 files changed, 719 insertions(+), 8 deletions(-) create mode 100644 src/ReactiveUI.WinUI/ActivationForViewFetcher.cs create mode 100644 src/ReactiveUI.WinUI/DispatcherQueueScheduler.cs create mode 100644 src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj create mode 100644 src/ReactiveUI.WinUI/Registrations.cs create mode 100644 src/ReactiveUI.WinUI/TransitioningContentControl.Empty.cs diff --git a/.gitignore b/.gitignore index 9faa066d62..2caf6d5a34 100644 --- a/.gitignore +++ b/.gitignore @@ -369,4 +369,5 @@ src/Tools/ **/[Rr]esources/[Rr]esource.[Dd]esigner.cs # MSBuild generator editor configs -**/*.GeneratedMSBuildEditorConfig.editorconfig \ No newline at end of file +**/*.GeneratedMSBuildEditorConfig.editorconfig +/app diff --git a/src/ReactiveUI.Uwp/Common/RoutedViewHost.cs b/src/ReactiveUI.Uwp/Common/RoutedViewHost.cs index db427230cd..f45f4d3bcc 100644 --- a/src/ReactiveUI.Uwp/Common/RoutedViewHost.cs +++ b/src/ReactiveUI.Uwp/Common/RoutedViewHost.cs @@ -8,15 +8,19 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reactive.Linq; -using System.Windows; using ReactiveUI; using Splat; -#if NETFX_CORE || HAS_UNO +#if HAS_WINUI +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +#elif NETFX_CORE || HAS_UNO +using System.Windows; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; #else +using System.Windows; using System.Windows.Controls; #endif diff --git a/src/ReactiveUI.Uwp/Common/ViewModelViewHost.cs b/src/ReactiveUI.Uwp/Common/ViewModelViewHost.cs index 94a6729792..71c57bf454 100644 --- a/src/ReactiveUI.Uwp/Common/ViewModelViewHost.cs +++ b/src/ReactiveUI.Uwp/Common/ViewModelViewHost.cs @@ -8,16 +8,22 @@ using System.Reactive; using System.Reactive.Disposables; using System.Reactive.Linq; -using System.Windows; using Splat; -#if NETFX_CORE || HAS_UNO +#if HAS_WINUI + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +#elif NETFX_CORE || HAS_UNO +using System.Windows; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; #else +using System.Windows; using System.Windows.Controls; #endif diff --git a/src/ReactiveUI.WinUI/ActivationForViewFetcher.cs b/src/ReactiveUI.WinUI/ActivationForViewFetcher.cs new file mode 100644 index 0000000000..59fe1e36b3 --- /dev/null +++ b/src/ReactiveUI.WinUI/ActivationForViewFetcher.cs @@ -0,0 +1,58 @@ +// Copyright (c) 2021 .NET Foundation and Contributors. All rights reserved. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Linq; +using System.Reactive.Linq; +using System.Reflection; +using Microsoft.UI.Xaml; +using Windows.Foundation; + +namespace ReactiveUI.WinUI +{ + /// + /// ActiveationForViewFetcher is how ReactiveUI determine when a + /// View is activated or deactivated. This is usually only used when porting + /// ReactiveUI to a new UI framework. + /// + public class ActivationForViewFetcher : IActivationForViewFetcher + { + /// + public int GetAffinityForView(Type view) => typeof(FrameworkElement).GetTypeInfo().IsAssignableFrom(view.GetTypeInfo()) ? 10 : 0; + + /// + public IObservable GetActivationForView(IActivatableView view) + { + if (!(view is FrameworkElement fe)) + { + return Observable.Empty; + } + + var viewLoaded = Observable.FromEvent, bool>( + eventHandler => + { + void Handler(FrameworkElement sender, object e) => eventHandler(true); + return Handler; + }, + x => fe.Loading += x, + x => fe.Loading -= x); + + var viewUnloaded = Observable.FromEvent( + eventHandler => + { + void Handler(object sender, RoutedEventArgs e) => eventHandler(false); + return Handler; + }, + x => fe.Unloaded += x, + x => fe.Unloaded -= x); + + return viewLoaded + .Merge(viewUnloaded) + .Select(b => b ? fe.WhenAnyValue(x => x.IsHitTestVisible).SkipWhile(x => !x) : Observables.False) + .Switch() + .DistinctUntilChanged(); + } + } +} diff --git a/src/ReactiveUI.WinUI/DispatcherQueueScheduler.cs b/src/ReactiveUI.WinUI/DispatcherQueueScheduler.cs new file mode 100644 index 0000000000..29437f4d1a --- /dev/null +++ b/src/ReactiveUI.WinUI/DispatcherQueueScheduler.cs @@ -0,0 +1,211 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT License. +// See the LICENSE file in the project root for more information. +// + +#if HAS_WINUI +using System.Reactive.Disposables; +using System.Threading; +using Microsoft.UI.Dispatching; + +namespace System.Reactive.Concurrency +{ + /// + /// Represents an object that schedules units of work on a . + /// + /// + /// This scheduler type is typically used indirectly through the and methods that use the Dispatcher on the calling thread. + /// + public class DispatcherQueueScheduler : LocalScheduler, ISchedulerPeriodic + { + /// + /// Gets the scheduler that schedules work on the for the current thread. + /// + public static DispatcherQueueScheduler Current + { + get + { + var dispatcher = DispatcherQueue.GetForCurrentThread(); + if (dispatcher == null) + { + throw new InvalidOperationException("There is no current dispatcher thread"); + } + + return new DispatcherQueueScheduler(dispatcher); + } + } + + /// + /// Constructs a that schedules units of work on the given . + /// + /// to schedule work on. + /// is null. + public DispatcherQueueScheduler(DispatcherQueue dispatcher) + { + Dispatcher = dispatcher ?? throw new ArgumentNullException(nameof(dispatcher)); + Priority = DispatcherQueuePriority.Normal; + + } + + /// + /// Constructs a that schedules units of work on the given at the given priority. + /// + /// to schedule work on. + /// Priority at which units of work are scheduled. + /// is null. + public DispatcherQueueScheduler(DispatcherQueue dispatcher, DispatcherQueuePriority priority) + { + Dispatcher = dispatcher ?? throw new ArgumentNullException(nameof(dispatcher)); + Priority = priority; + } + + /// + /// Gets the associated with the . + /// + public DispatcherQueue Dispatcher { get; } + + /// + /// Gets the priority at which work items will be dispatched. + /// + public DispatcherQueuePriority Priority { get; } + + /// + /// Schedules an action to be executed on the dispatcher. + /// + /// The type of the state passed to the scheduled action. + /// State passed to the action to be executed. + /// Action to be executed. + /// The disposable object used to cancel the scheduled action (best effort). + /// is null. + public override IDisposable Schedule(TState state, Func action) + { + if (action == null) + { + throw new ArgumentNullException(nameof(action)); + } + + var d = new SingleAssignmentDisposable(); + + Dispatcher.TryEnqueue(Priority, + () => + { + if (!d.IsDisposed) + { + d.Disposable = action(this, state); + } + }); + + return d; + } + + /// + /// Schedules an action to be executed after on the dispatcher, using a object. + /// + /// The type of the state passed to the scheduled action. + /// State passed to the action to be executed. + /// Action to be executed. + /// Relative time after which to execute the action. + /// The disposable object used to cancel the scheduled action (best effort). + /// is null. + public override IDisposable Schedule(TState state, TimeSpan dueTime, Func action) + { + if (action == null) + { + throw new ArgumentNullException(nameof(action)); + } + + var dt = Scheduler.Normalize(dueTime); + if (dt.Ticks == 0) + { + return Schedule(state, action); + } + + return ScheduleSlow(state, dt, action); + } + + private IDisposable ScheduleSlow(TState state, TimeSpan dueTime, Func action) + { + var d = new MultipleAssignmentDisposable(); + + var timer = Dispatcher.CreateTimer(); + + timer.Tick += (s, e) => + { + var t = Interlocked.Exchange(ref timer, null); + if (t != null) + { + try + { + d.Disposable = action(this, state); + } + finally + { + t.Stop(); + action = static (s, t) => Disposable.Empty; + } + } + }; + + timer.Interval = dueTime; + timer.Start(); + + d.Disposable = Disposable.Create(() => + { + var t = Interlocked.Exchange(ref timer, null); + if (t != null) + { + t.Stop(); + action = static (s, t) => Disposable.Empty; + } + }); + + return d; + } + + /// + /// Schedules a periodic piece of work on the dispatcher, using a object. + /// + /// The type of the state passed to the scheduled action. + /// Initial state passed to the action upon the first iteration. + /// Period for running the work periodically. + /// Action to be executed, potentially updating the state. + /// The disposable object used to cancel the scheduled recurring action (best effort). + /// is null. + /// is less than . + public IDisposable SchedulePeriodic(TState state, TimeSpan period, Func action) + { + if (period < TimeSpan.Zero) + { + throw new ArgumentOutOfRangeException(nameof(period)); + } + + if (action == null) + { + throw new ArgumentNullException(nameof(action)); + } + + var timer = Dispatcher.CreateTimer(); + + var state1 = state; + + timer.Tick += (s, e) => + { + state1 = action(state1); + }; + + timer.Interval = period; + timer.Start(); + + return Disposable.Create(() => + { + var t = Interlocked.Exchange(ref timer, null); + if (t != null) + { + t.Stop(); + action = static _ => _; + } + }); + } + } +} +#endif diff --git a/src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj b/src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj new file mode 100644 index 0000000000..7e446cdc68 --- /dev/null +++ b/src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj @@ -0,0 +1,29 @@ + + + net5.0-windows10.0.19041.0 + 10.0.17763.0 + Contains the ReactiveUI platform specific extensions for WinUI Desktop + ReactiveUI.WinUI.Desktop + win10-x86;win10-x64 + HAS_WINUI + mvvm;reactiveui;rx;reactive extensions;observable;LINQ;events;winui + true + true + + + + + + + + + + + + + + + + + + diff --git a/src/ReactiveUI.WinUI/Registrations.cs b/src/ReactiveUI.WinUI/Registrations.cs new file mode 100644 index 0000000000..444fe8bab1 --- /dev/null +++ b/src/ReactiveUI.WinUI/Registrations.cs @@ -0,0 +1,45 @@ +// Copyright (c) 2021 .NET Foundation and Contributors. All rights reserved. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Reactive.Concurrency; +using ReactiveUI; +using Splat; + +namespace ReactiveUI.WinUI +{ + /// + /// Registrations specific to the WPF platform. + /// + public class Registrations : IWantsToRegisterStuff + { + /// + public void Register(Action, Type> registerFunction) + { + if (registerFunction is null) + { + throw new ArgumentNullException(nameof(registerFunction)); + } + + registerFunction(() => new PlatformOperations(), typeof(IPlatformOperations)); + + registerFunction(() => new ActivationForViewFetcher(), typeof(IActivationForViewFetcher)); + + // registerFunction(() => new DependencyObjectObservableForProperty(), typeof(ICreatesObservableForProperty)); + registerFunction(() => new BooleanToVisibilityTypeConverter(), typeof(IBindingTypeConverter)); + registerFunction(() => new AutoDataTemplateBindingHook(), typeof(IPropertyBindingHook)); + registerFunction(() => new ComponentModelTypeConverter(), typeof(IBindingTypeConverter)); + + if (!ModeDetector.InUnitTestRunner()) + { + // NB: On .NET Core, trying to touch DispatcherScheduler blows up :cry: + RxApp.MainThreadScheduler = new WaitForDispatcherScheduler(() => { return DispatcherQueueScheduler.Current; }); + RxApp.TaskpoolScheduler = TaskPoolScheduler.Default; + } + + RxApp.SuppressViewCommandBindingMessage = true; + } + } +} diff --git a/src/ReactiveUI.WinUI/TransitioningContentControl.Empty.cs b/src/ReactiveUI.WinUI/TransitioningContentControl.Empty.cs new file mode 100644 index 0000000000..a3373f3b2d --- /dev/null +++ b/src/ReactiveUI.WinUI/TransitioningContentControl.Empty.cs @@ -0,0 +1,19 @@ +// Copyright (c) 2021 .NET Foundation and Contributors. All rights reserved. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System.Diagnostics.CodeAnalysis; +using Microsoft.UI.Xaml.Controls; + +namespace ReactiveUI +{ + /// + /// A control with a single transition. + /// + [SuppressMessage("Design", "CA1010:Collections should implement generic interface", Justification = "Deliberate usage")] + public + class TransitioningContentControl : ContentControl + { + } +} diff --git a/src/ReactiveUI.sln b/src/ReactiveUI.sln index edc351be93..9e3a6f92a5 100644 --- a/src/ReactiveUI.sln +++ b/src/ReactiveUI.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31612.314 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31613.86 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BD9762CF-E104-481C-96A6-26E624B86283}" ProjectSection(SolutionItems) = preProject @@ -65,106 +65,440 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{2AE709FA EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactiveUI.Maui", "ReactiveUI.Maui\ReactiveUI.Maui.csproj", "{3C552CA0-C364-4E51-8825-35D082C1D5BA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Uwp", "ReactiveUI.Uwp\ReactiveUI.Uwp.csproj", "{3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactiveUI.Uwp", "ReactiveUI.Uwp\ReactiveUI.Uwp.csproj", "{3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactiveUI.WinUI", "ReactiveUI.WinUI\ReactiveUI.WinUI.csproj", "{4FF9F04B-928E-47B6-836F-546B584F597C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Apps", "Apps", "{31006C9B-6477-47ED-9132-A2755F2CFB74}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactiveUI.WinUI.TestApp", "..\app\ReactiveUI.WinUI.TestApp\ReactiveUI.WinUI.TestApp.csproj", "{68F46362-EC2C-4B7B-8476-7B09341F7AB2}" +EndProject +Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "ReactiveUI.WinUI.TestApp (Package)", "..\app\ReactiveUI.WinUI.TestApp (Package)\ReactiveUI.WinUI.TestApp (Package).wapproj", "{BD7D8DF6-5774-4DD7-83E1-356977F11BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|arm64 = Debug|arm64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|arm64 = Release|arm64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Debug|arm64.ActiveCfg = Debug|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Debug|arm64.Build.0 = Debug|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Debug|x64.ActiveCfg = Debug|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Debug|x64.Build.0 = Debug|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Debug|x86.ActiveCfg = Debug|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Debug|x86.Build.0 = Debug|Any CPU {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Release|Any CPU.ActiveCfg = Release|Any CPU {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Release|Any CPU.Build.0 = Release|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Release|arm64.ActiveCfg = Release|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Release|arm64.Build.0 = Release|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Release|x64.ActiveCfg = Release|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Release|x64.Build.0 = Release|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Release|x86.ActiveCfg = Release|Any CPU + {464CB812-F99F-401B-BE4C-E8F0515CD19D}.Release|x86.Build.0 = Release|Any CPU {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Debug|arm64.ActiveCfg = Debug|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Debug|arm64.Build.0 = Debug|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Debug|x64.ActiveCfg = Debug|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Debug|x64.Build.0 = Debug|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Debug|x86.ActiveCfg = Debug|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Debug|x86.Build.0 = Debug|Any CPU {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Release|Any CPU.Build.0 = Release|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Release|arm64.ActiveCfg = Release|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Release|arm64.Build.0 = Release|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Release|x64.ActiveCfg = Release|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Release|x64.Build.0 = Release|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Release|x86.ActiveCfg = Release|Any CPU + {F5A6E11B-B074-4A1C-B937-267D840E31DF}.Release|x86.Build.0 = Release|Any CPU {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Debug|arm64.ActiveCfg = Debug|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Debug|arm64.Build.0 = Debug|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Debug|x64.ActiveCfg = Debug|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Debug|x64.Build.0 = Debug|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Debug|x86.ActiveCfg = Debug|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Debug|x86.Build.0 = Debug|Any CPU {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Release|Any CPU.ActiveCfg = Release|Any CPU {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Release|Any CPU.Build.0 = Release|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Release|arm64.ActiveCfg = Release|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Release|arm64.Build.0 = Release|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Release|x64.ActiveCfg = Release|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Release|x64.Build.0 = Release|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Release|x86.ActiveCfg = Release|Any CPU + {DDF89A7A-5CC9-4243-98E4-462860D5D963}.Release|x86.Build.0 = Release|Any CPU {C11F6165-6142-476F-83F1-CFEBC330C769}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C11F6165-6142-476F-83F1-CFEBC330C769}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Debug|arm64.ActiveCfg = Debug|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Debug|arm64.Build.0 = Debug|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Debug|x64.ActiveCfg = Debug|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Debug|x64.Build.0 = Debug|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Debug|x86.ActiveCfg = Debug|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Debug|x86.Build.0 = Debug|Any CPU {C11F6165-6142-476F-83F1-CFEBC330C769}.Release|Any CPU.ActiveCfg = Release|Any CPU {C11F6165-6142-476F-83F1-CFEBC330C769}.Release|Any CPU.Build.0 = Release|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Release|arm64.ActiveCfg = Release|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Release|arm64.Build.0 = Release|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Release|x64.ActiveCfg = Release|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Release|x64.Build.0 = Release|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Release|x86.ActiveCfg = Release|Any CPU + {C11F6165-6142-476F-83F1-CFEBC330C769}.Release|x86.Build.0 = Release|Any CPU {84A9E530-93D7-4108-9887-690127F70AF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {84A9E530-93D7-4108-9887-690127F70AF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Debug|arm64.ActiveCfg = Debug|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Debug|arm64.Build.0 = Debug|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Debug|x64.ActiveCfg = Debug|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Debug|x64.Build.0 = Debug|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Debug|x86.ActiveCfg = Debug|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Debug|x86.Build.0 = Debug|Any CPU {84A9E530-93D7-4108-9887-690127F70AF5}.Release|Any CPU.ActiveCfg = Release|Any CPU {84A9E530-93D7-4108-9887-690127F70AF5}.Release|Any CPU.Build.0 = Release|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Release|arm64.ActiveCfg = Release|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Release|arm64.Build.0 = Release|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Release|x64.ActiveCfg = Release|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Release|x64.Build.0 = Release|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Release|x86.ActiveCfg = Release|Any CPU + {84A9E530-93D7-4108-9887-690127F70AF5}.Release|x86.Build.0 = Release|Any CPU {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Debug|arm64.ActiveCfg = Debug|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Debug|arm64.Build.0 = Debug|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Debug|x64.ActiveCfg = Debug|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Debug|x64.Build.0 = Debug|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Debug|x86.ActiveCfg = Debug|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Debug|x86.Build.0 = Debug|Any CPU {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Release|Any CPU.ActiveCfg = Release|Any CPU {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Release|Any CPU.Build.0 = Release|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Release|arm64.ActiveCfg = Release|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Release|arm64.Build.0 = Release|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Release|x64.ActiveCfg = Release|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Release|x64.Build.0 = Release|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Release|x86.ActiveCfg = Release|Any CPU + {B311B0EC-CEF3-45E6-BA7A-EC6AB58E7E7D}.Release|x86.Build.0 = Release|Any CPU {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Debug|arm64.ActiveCfg = Debug|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Debug|arm64.Build.0 = Debug|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Debug|x64.ActiveCfg = Debug|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Debug|x64.Build.0 = Debug|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Debug|x86.ActiveCfg = Debug|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Debug|x86.Build.0 = Debug|Any CPU {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Release|Any CPU.ActiveCfg = Release|Any CPU {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Release|Any CPU.Build.0 = Release|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Release|arm64.ActiveCfg = Release|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Release|arm64.Build.0 = Release|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Release|x64.ActiveCfg = Release|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Release|x64.Build.0 = Release|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Release|x86.ActiveCfg = Release|Any CPU + {2ADE0A50-5012-4341-8F4F-97597C2D6920}.Release|x86.Build.0 = Release|Any CPU {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Debug|arm64.ActiveCfg = Debug|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Debug|arm64.Build.0 = Debug|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Debug|x64.ActiveCfg = Debug|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Debug|x64.Build.0 = Debug|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Debug|x86.ActiveCfg = Debug|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Debug|x86.Build.0 = Debug|Any CPU {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Release|Any CPU.ActiveCfg = Release|Any CPU {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Release|Any CPU.Build.0 = Release|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Release|arm64.ActiveCfg = Release|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Release|arm64.Build.0 = Release|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Release|x64.ActiveCfg = Release|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Release|x64.Build.0 = Release|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Release|x86.ActiveCfg = Release|Any CPU + {15CF3AA6-9F7C-4F23-BAE7-4A93352E94B6}.Release|x86.Build.0 = Release|Any CPU {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Debug|arm64.ActiveCfg = Debug|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Debug|arm64.Build.0 = Debug|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Debug|x64.ActiveCfg = Debug|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Debug|x64.Build.0 = Debug|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Debug|x86.ActiveCfg = Debug|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Debug|x86.Build.0 = Debug|Any CPU {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Release|Any CPU.ActiveCfg = Release|Any CPU {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Release|Any CPU.Build.0 = Release|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Release|arm64.ActiveCfg = Release|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Release|arm64.Build.0 = Release|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Release|x64.ActiveCfg = Release|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Release|x64.Build.0 = Release|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Release|x86.ActiveCfg = Release|Any CPU + {1AC71A71-F5F3-4F96-BDA9-A9DC7F572DB9}.Release|x86.Build.0 = Release|Any CPU {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Debug|arm64.ActiveCfg = Debug|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Debug|arm64.Build.0 = Debug|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Debug|x64.ActiveCfg = Debug|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Debug|x64.Build.0 = Debug|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Debug|x86.ActiveCfg = Debug|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Debug|x86.Build.0 = Debug|Any CPU {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Release|Any CPU.ActiveCfg = Release|Any CPU {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Release|Any CPU.Build.0 = Release|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Release|arm64.ActiveCfg = Release|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Release|arm64.Build.0 = Release|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Release|x64.ActiveCfg = Release|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Release|x64.Build.0 = Release|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Release|x86.ActiveCfg = Release|Any CPU + {7DE43BB9-5AC8-446A-8D8B-88C9201D802E}.Release|x86.Build.0 = Release|Any CPU {20750BB4-36DD-4F8C-B970-D7809810EC98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {20750BB4-36DD-4F8C-B970-D7809810EC98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Debug|arm64.ActiveCfg = Debug|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Debug|arm64.Build.0 = Debug|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Debug|x64.ActiveCfg = Debug|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Debug|x64.Build.0 = Debug|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Debug|x86.ActiveCfg = Debug|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Debug|x86.Build.0 = Debug|Any CPU {20750BB4-36DD-4F8C-B970-D7809810EC98}.Release|Any CPU.ActiveCfg = Release|Any CPU {20750BB4-36DD-4F8C-B970-D7809810EC98}.Release|Any CPU.Build.0 = Release|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Release|arm64.ActiveCfg = Release|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Release|arm64.Build.0 = Release|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Release|x64.ActiveCfg = Release|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Release|x64.Build.0 = Release|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Release|x86.ActiveCfg = Release|Any CPU + {20750BB4-36DD-4F8C-B970-D7809810EC98}.Release|x86.Build.0 = Release|Any CPU {404B0F3F-7343-4E54-A863-F27B99FE788B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {404B0F3F-7343-4E54-A863-F27B99FE788B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Debug|arm64.ActiveCfg = Debug|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Debug|arm64.Build.0 = Debug|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Debug|x64.ActiveCfg = Debug|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Debug|x64.Build.0 = Debug|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Debug|x86.ActiveCfg = Debug|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Debug|x86.Build.0 = Debug|Any CPU {404B0F3F-7343-4E54-A863-F27B99FE788B}.Release|Any CPU.ActiveCfg = Release|Any CPU {404B0F3F-7343-4E54-A863-F27B99FE788B}.Release|Any CPU.Build.0 = Release|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Release|arm64.ActiveCfg = Release|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Release|arm64.Build.0 = Release|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Release|x64.ActiveCfg = Release|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Release|x64.Build.0 = Release|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Release|x86.ActiveCfg = Release|Any CPU + {404B0F3F-7343-4E54-A863-F27B99FE788B}.Release|x86.Build.0 = Release|Any CPU {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Debug|arm64.ActiveCfg = Debug|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Debug|arm64.Build.0 = Debug|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Debug|x64.ActiveCfg = Debug|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Debug|x64.Build.0 = Debug|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Debug|x86.ActiveCfg = Debug|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Debug|x86.Build.0 = Debug|Any CPU {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Release|Any CPU.ActiveCfg = Release|Any CPU {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Release|Any CPU.Build.0 = Release|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Release|arm64.ActiveCfg = Release|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Release|arm64.Build.0 = Release|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Release|x64.ActiveCfg = Release|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Release|x64.Build.0 = Release|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Release|x86.ActiveCfg = Release|Any CPU + {7ED6D69F-138F-40BD-9F37-3E4050E4D19B}.Release|x86.Build.0 = Release|Any CPU {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Debug|arm64.ActiveCfg = Debug|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Debug|arm64.Build.0 = Debug|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Debug|x64.ActiveCfg = Debug|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Debug|x64.Build.0 = Debug|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Debug|x86.ActiveCfg = Debug|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Debug|x86.Build.0 = Debug|Any CPU {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Release|Any CPU.ActiveCfg = Release|Any CPU {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Release|Any CPU.Build.0 = Release|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Release|arm64.ActiveCfg = Release|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Release|arm64.Build.0 = Release|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Release|x64.ActiveCfg = Release|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Release|x64.Build.0 = Release|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Release|x86.ActiveCfg = Release|Any CPU + {CD8B19A9-316E-4FBC-8F0C-87ADC6AAD684}.Release|x86.Build.0 = Release|Any CPU {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Debug|arm64.ActiveCfg = Debug|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Debug|arm64.Build.0 = Debug|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Debug|x64.ActiveCfg = Debug|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Debug|x64.Build.0 = Debug|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Debug|x86.ActiveCfg = Debug|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Debug|x86.Build.0 = Debug|Any CPU {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Release|Any CPU.ActiveCfg = Release|Any CPU {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Release|Any CPU.Build.0 = Release|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Release|arm64.ActiveCfg = Release|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Release|arm64.Build.0 = Release|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Release|x64.ActiveCfg = Release|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Release|x64.Build.0 = Release|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Release|x86.ActiveCfg = Release|Any CPU + {36FC3269-B7D0-4D79-A54A-B26B6190E8A2}.Release|x86.Build.0 = Release|Any CPU {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Debug|arm64.ActiveCfg = Debug|Any CPU + {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Debug|x64.ActiveCfg = Debug|Any CPU + {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Debug|x86.ActiveCfg = Debug|Any CPU {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Release|Any CPU.Build.0 = Release|Any CPU + {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Release|arm64.ActiveCfg = Release|Any CPU + {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Release|x64.ActiveCfg = Release|Any CPU + {0C7EDFF0-80BE-4FFC-A1B9-0C48043B71F3}.Release|x86.ActiveCfg = Release|Any CPU {86430CEC-BAA3-4ED4-A90D-982437137D19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86430CEC-BAA3-4ED4-A90D-982437137D19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Debug|arm64.ActiveCfg = Debug|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Debug|arm64.Build.0 = Debug|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Debug|x64.ActiveCfg = Debug|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Debug|x64.Build.0 = Debug|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Debug|x86.ActiveCfg = Debug|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Debug|x86.Build.0 = Debug|Any CPU {86430CEC-BAA3-4ED4-A90D-982437137D19}.Release|Any CPU.ActiveCfg = Release|Any CPU {86430CEC-BAA3-4ED4-A90D-982437137D19}.Release|Any CPU.Build.0 = Release|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Release|arm64.ActiveCfg = Release|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Release|arm64.Build.0 = Release|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Release|x64.ActiveCfg = Release|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Release|x64.Build.0 = Release|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Release|x86.ActiveCfg = Release|Any CPU + {86430CEC-BAA3-4ED4-A90D-982437137D19}.Release|x86.Build.0 = Release|Any CPU {366789D4-4117-46CE-864F-BF1201F35319}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {366789D4-4117-46CE-864F-BF1201F35319}.Debug|Any CPU.Build.0 = Debug|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Debug|arm64.ActiveCfg = Debug|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Debug|arm64.Build.0 = Debug|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Debug|x64.ActiveCfg = Debug|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Debug|x64.Build.0 = Debug|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Debug|x86.ActiveCfg = Debug|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Debug|x86.Build.0 = Debug|Any CPU {366789D4-4117-46CE-864F-BF1201F35319}.Release|Any CPU.ActiveCfg = Release|Any CPU {366789D4-4117-46CE-864F-BF1201F35319}.Release|Any CPU.Build.0 = Release|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Release|arm64.ActiveCfg = Release|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Release|arm64.Build.0 = Release|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Release|x64.ActiveCfg = Release|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Release|x64.Build.0 = Release|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Release|x86.ActiveCfg = Release|Any CPU + {366789D4-4117-46CE-864F-BF1201F35319}.Release|x86.Build.0 = Release|Any CPU {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Debug|arm64.ActiveCfg = Debug|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Debug|arm64.Build.0 = Debug|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Debug|x64.ActiveCfg = Debug|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Debug|x64.Build.0 = Debug|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Debug|x86.ActiveCfg = Debug|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Debug|x86.Build.0 = Debug|Any CPU {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Release|Any CPU.ActiveCfg = Release|Any CPU {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Release|Any CPU.Build.0 = Release|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Release|arm64.ActiveCfg = Release|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Release|arm64.Build.0 = Release|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Release|x64.ActiveCfg = Release|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Release|x64.Build.0 = Release|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Release|x86.ActiveCfg = Release|Any CPU + {1FD70B38-E2FB-4A46-BE07-C0F6ACE6FD90}.Release|x86.Build.0 = Release|Any CPU {999D555D-C567-457C-95F7-8AD61310C56E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {999D555D-C567-457C-95F7-8AD61310C56E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Debug|arm64.ActiveCfg = Debug|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Debug|arm64.Build.0 = Debug|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Debug|x64.ActiveCfg = Debug|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Debug|x64.Build.0 = Debug|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Debug|x86.ActiveCfg = Debug|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Debug|x86.Build.0 = Debug|Any CPU {999D555D-C567-457C-95F7-8AD61310C56E}.Release|Any CPU.ActiveCfg = Release|Any CPU {999D555D-C567-457C-95F7-8AD61310C56E}.Release|Any CPU.Build.0 = Release|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Release|arm64.ActiveCfg = Release|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Release|arm64.Build.0 = Release|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Release|x64.ActiveCfg = Release|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Release|x64.Build.0 = Release|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Release|x86.ActiveCfg = Release|Any CPU + {999D555D-C567-457C-95F7-8AD61310C56E}.Release|x86.Build.0 = Release|Any CPU {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Debug|arm64.ActiveCfg = Debug|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Debug|arm64.Build.0 = Debug|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Debug|x64.ActiveCfg = Debug|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Debug|x64.Build.0 = Debug|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Debug|x86.ActiveCfg = Debug|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Debug|x86.Build.0 = Debug|Any CPU {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Release|Any CPU.ActiveCfg = Release|Any CPU {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Release|Any CPU.Build.0 = Release|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Release|arm64.ActiveCfg = Release|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Release|arm64.Build.0 = Release|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Release|x64.ActiveCfg = Release|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Release|x64.Build.0 = Release|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Release|x86.ActiveCfg = Release|Any CPU + {46D5C71E-2E58-4454-BE3A-30B9047A2D1E}.Release|x86.Build.0 = Release|Any CPU {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Debug|arm64.ActiveCfg = Debug|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Debug|arm64.Build.0 = Debug|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Debug|x64.ActiveCfg = Debug|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Debug|x64.Build.0 = Debug|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Debug|x86.ActiveCfg = Debug|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Debug|x86.Build.0 = Debug|Any CPU {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Release|Any CPU.Build.0 = Release|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Release|arm64.ActiveCfg = Release|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Release|arm64.Build.0 = Release|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Release|x64.ActiveCfg = Release|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Release|x64.Build.0 = Release|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Release|x86.ActiveCfg = Release|Any CPU + {3C552CA0-C364-4E51-8825-35D082C1D5BA}.Release|x86.Build.0 = Release|Any CPU {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Debug|arm64.ActiveCfg = Debug|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Debug|arm64.Build.0 = Debug|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Debug|x64.ActiveCfg = Debug|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Debug|x64.Build.0 = Debug|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Debug|x86.ActiveCfg = Debug|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Debug|x86.Build.0 = Debug|Any CPU {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Release|Any CPU.ActiveCfg = Release|Any CPU {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Release|Any CPU.Build.0 = Release|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Release|arm64.ActiveCfg = Release|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Release|arm64.Build.0 = Release|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Release|x64.ActiveCfg = Release|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Release|x64.Build.0 = Release|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Release|x86.ActiveCfg = Release|Any CPU + {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439}.Release|x86.Build.0 = Release|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Debug|arm64.ActiveCfg = Debug|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Debug|arm64.Build.0 = Debug|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Debug|x64.ActiveCfg = Debug|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Debug|x64.Build.0 = Debug|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Debug|x86.ActiveCfg = Debug|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Debug|x86.Build.0 = Debug|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|Any CPU.Build.0 = Release|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|arm64.ActiveCfg = Release|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|arm64.Build.0 = Release|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|x64.ActiveCfg = Release|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|x64.Build.0 = Release|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|x86.ActiveCfg = Release|Any CPU + {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|x86.Build.0 = Release|Any CPU + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|Any CPU.ActiveCfg = Debug|x86 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|arm64.ActiveCfg = Debug|arm64 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|arm64.Build.0 = Debug|arm64 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|x64.ActiveCfg = Debug|x64 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|x64.Build.0 = Debug|x64 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|x86.ActiveCfg = Debug|x86 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|x86.Build.0 = Debug|x86 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|Any CPU.ActiveCfg = Release|x86 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|arm64.ActiveCfg = Release|arm64 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|arm64.Build.0 = Release|arm64 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|x64.ActiveCfg = Release|x64 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|x64.Build.0 = Release|x64 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|x86.ActiveCfg = Release|x86 + {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|x86.Build.0 = Release|x86 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|Any CPU.ActiveCfg = Debug|x86 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|arm64.ActiveCfg = Debug|arm64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|arm64.Build.0 = Debug|arm64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|arm64.Deploy.0 = Debug|arm64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x64.ActiveCfg = Debug|x64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x64.Build.0 = Debug|x64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x64.Deploy.0 = Debug|x64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x86.ActiveCfg = Debug|x86 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x86.Build.0 = Debug|x86 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x86.Deploy.0 = Debug|x86 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|Any CPU.ActiveCfg = Release|x86 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|arm64.ActiveCfg = Release|arm64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|arm64.Build.0 = Release|arm64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|arm64.Deploy.0 = Release|arm64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x64.ActiveCfg = Release|x64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x64.Build.0 = Release|x64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x64.Deploy.0 = Release|x64 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x86.ActiveCfg = Release|x86 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x86.Build.0 = Release|x86 + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x86.Deploy.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -193,6 +527,9 @@ Global {46D5C71E-2E58-4454-BE3A-30B9047A2D1E} = {2AE709FA-BE58-4287-BFD3-E80BEB605125} {3C552CA0-C364-4E51-8825-35D082C1D5BA} = {EF7ED1B0-00E4-4CD0-9741-0D1D4463B8EC} {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439} = {EF7ED1B0-00E4-4CD0-9741-0D1D4463B8EC} + {4FF9F04B-928E-47B6-836F-546B584F597C} = {EF7ED1B0-00E4-4CD0-9741-0D1D4463B8EC} + {68F46362-EC2C-4B7B-8476-7B09341F7AB2} = {31006C9B-6477-47ED-9132-A2755F2CFB74} + {BD7D8DF6-5774-4DD7-83E1-356977F11BEC} = {31006C9B-6477-47ED-9132-A2755F2CFB74} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9326B58C-0AD3-4527-B3F4-86B54673C62E} diff --git a/src/ReactiveUI/Properties/AssemblyInfo.cs b/src/ReactiveUI/Properties/AssemblyInfo.cs index e234544d06..b9a80756d2 100644 --- a/src/ReactiveUI/Properties/AssemblyInfo.cs +++ b/src/ReactiveUI/Properties/AssemblyInfo.cs @@ -17,3 +17,4 @@ [assembly: InternalsVisibleTo("ReactiveUI.Drawing")] [assembly: InternalsVisibleTo("ReactiveUI.TestRunner.Android")] [assembly: InternalsVisibleTo("ReactiveUI.Uwp")] +[assembly: InternalsVisibleTo("ReactiveUI.WinUI")] From 1b3d3c4c4278ab490f4702ea53d8d3af273d0326 Mon Sep 17 00:00:00 2001 From: Harvinder Singh Date: Mon, 23 Aug 2021 14:11:13 +1000 Subject: [PATCH 2/4] ReactivePage, ReactiveUserControl, DependencyProperties now work. Also, The ReactiveUI.WinUI is getting loaded instead of .net startandard dll. --- .../Common/BooleanToVisibilityHint.cs | 4 +- .../BooleanToVisibilityTypeConverter.cs | 7 +- src/ReactiveUI.Uwp/Common/ReactivePage.cs | 7 +- .../Common/ReactiveUserControl.cs | 7 +- .../DependencyObjectObservableForProperty.cs | 161 ++++++++++++++++++ src/ReactiveUI.WinUI/Registrations.cs | 4 +- src/ReactiveUI.sln | 42 ----- .../Mixins/DependencyResolverMixins.cs | 1 + src/ReactiveUI/RegistrationNamespace.cs | 5 + 9 files changed, 186 insertions(+), 52 deletions(-) create mode 100644 src/ReactiveUI.WinUI/DependencyObjectObservableForProperty.cs diff --git a/src/ReactiveUI.Uwp/Common/BooleanToVisibilityHint.cs b/src/ReactiveUI.Uwp/Common/BooleanToVisibilityHint.cs index 24ece0b4f4..3ffdbeb0e1 100644 --- a/src/ReactiveUI.Uwp/Common/BooleanToVisibilityHint.cs +++ b/src/ReactiveUI.Uwp/Common/BooleanToVisibilityHint.cs @@ -5,7 +5,9 @@ using System; using System.Diagnostics.CodeAnalysis; -#if NETFX_CORE || HAS_UNO +#if HAS_WINUI +using Microsoft.UI.Xaml; +#elif NETFX_CORE || HAS_UNO using Windows.UI.Xaml; #else using System.Windows; diff --git a/src/ReactiveUI.Uwp/Common/BooleanToVisibilityTypeConverter.cs b/src/ReactiveUI.Uwp/Common/BooleanToVisibilityTypeConverter.cs index dbb4f93eb7..7fbe4af8e0 100644 --- a/src/ReactiveUI.Uwp/Common/BooleanToVisibilityTypeConverter.cs +++ b/src/ReactiveUI.Uwp/Common/BooleanToVisibilityTypeConverter.cs @@ -4,7 +4,9 @@ // See the LICENSE file in the project root for full license information. using System; -#if NETFX_CORE || HAS_UNO +#if HAS_WINUI +using Microsoft.UI.Xaml; +#elif NETFX_CORE || HAS_UNO using Windows.UI.Xaml; #else using System.Windows; @@ -48,7 +50,8 @@ public bool TryConvert(object? from, Type toType, object? conversionHint, out ob if (toType == typeof(Visibility) && from is bool fromBool) { var fromAsBool = (hint & BooleanToVisibilityHint.Inverse) != 0 ? !fromBool : fromBool; -#if !NETFX_CORE && !HAS_UNO + +#if !NETFX_CORE && !HAS_UNO && !HAS_WINUI var notVisible = (hint & BooleanToVisibilityHint.UseHidden) != 0 ? Visibility.Hidden : Visibility.Collapsed; #else var notVisible = Visibility.Collapsed; diff --git a/src/ReactiveUI.Uwp/Common/ReactivePage.cs b/src/ReactiveUI.Uwp/Common/ReactivePage.cs index 12ba4a37d3..660b7f2752 100644 --- a/src/ReactiveUI.Uwp/Common/ReactivePage.cs +++ b/src/ReactiveUI.Uwp/Common/ReactivePage.cs @@ -5,7 +5,10 @@ using System; using System.Diagnostics.CodeAnalysis; -#if NETFX_CORE || HAS_UNO +#if HAS_WINUI +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +#elif NETFX_CORE || HAS_UNO using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; #else @@ -48,7 +51,7 @@ namespace ReactiveUI /// /// /// - /// Note that UWP projects do not support the TypeArguments attribute. The XAML designer window in WPF projects also does not + /// Note that UWP and WinUI projects do not support the TypeArguments attribute. The XAML designer window in WPF projects also does not /// support generic types. To use in XAML documents you need to create a base class /// where you derive from with the type argument filled in. /// diff --git a/src/ReactiveUI.Uwp/Common/ReactiveUserControl.cs b/src/ReactiveUI.Uwp/Common/ReactiveUserControl.cs index 0c1c7621b8..3ea6f860c2 100644 --- a/src/ReactiveUI.Uwp/Common/ReactiveUserControl.cs +++ b/src/ReactiveUI.Uwp/Common/ReactiveUserControl.cs @@ -5,7 +5,10 @@ using System; using System.Diagnostics.CodeAnalysis; -#if NETFX_CORE || HAS_UNO +#if HAS_WINUI +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +#elif NETFX_CORE || HAS_UNO using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; #else @@ -48,7 +51,7 @@ namespace ReactiveUI /// /// /// - /// Note that UWP projects do not support the TypeArguments attribute. The XAML designer window in WPF projects also does not + /// Note that UWP and WinUI projects do not support the TypeArguments attribute. The XAML designer window in WPF projects also does not /// support generic types. To use in XAML documents you need to create a base class /// where you derive from with the type argument filled in. /// diff --git a/src/ReactiveUI.WinUI/DependencyObjectObservableForProperty.cs b/src/ReactiveUI.WinUI/DependencyObjectObservableForProperty.cs new file mode 100644 index 0000000000..058764ed20 --- /dev/null +++ b/src/ReactiveUI.WinUI/DependencyObjectObservableForProperty.cs @@ -0,0 +1,161 @@ +// Copyright (c) 2021 .NET Foundation and Contributors. All rights reserved. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Globalization; +using System.Linq.Expressions; +using System.Reactive.Disposables; +using System.Reactive.Linq; +using System.Reflection; +using Microsoft.UI.Xaml; +using Splat; + +#if HAS_UNO +namespace ReactiveUI.Uno +#else +namespace ReactiveUI +#endif +{ + /// + /// Creates a observable for a property if available that is based on a DependencyProperty. + /// + public class DependencyObjectObservableForProperty : ICreatesObservableForProperty + { + /// + public int GetAffinityForObject(Type type, string propertyName, bool beforeChanged = false) + { + if (!typeof(DependencyObject).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) + { + return 0; + } + + if (GetDependencyPropertyFetcher(type, propertyName) == null) + { + return 0; + } + + return 6; + } + + /// + public IObservable> GetNotificationForProperty(object sender, Expression expression, string propertyName, bool beforeChanged = false, bool suppressWarnings = false) + { + if (sender == null) + { + throw new ArgumentNullException(nameof(sender)); + } + + if (sender is not DependencyObject depSender) + { + throw new ArgumentException("The sender must be a DependencyObject", nameof(sender)); + } + + var type = sender.GetType(); + + if (beforeChanged) + { + this.Log().Warn( + CultureInfo.InvariantCulture, + "Tried to bind DO {0}.{1}, but DPs can't do beforeChanged. Binding as POCO object", + type.FullName, + propertyName); + + var ret = new POCOObservableForProperty(); + return ret.GetNotificationForProperty(sender, expression, propertyName, beforeChanged); + } + + var dpFetcher = GetDependencyPropertyFetcher(type, propertyName); + if (dpFetcher == null) + { + this.Log().Warn( + CultureInfo.InvariantCulture, + "Tried to bind DO {0}.{1}, but DP doesn't exist. Binding as POCO object", + type.FullName, + propertyName); + + var ret = new POCOObservableForProperty(); + return ret.GetNotificationForProperty(sender, expression, propertyName, beforeChanged); + } + + return Observable.Create>(subj => + { + var handler = new DependencyPropertyChangedCallback((_, _) => + subj.OnNext(new ObservedChange(sender, expression, default))); + + var dependencyProperty = dpFetcher(); + var token = depSender.RegisterPropertyChangedCallback(dependencyProperty, handler); + return Disposable.Create(() => depSender.UnregisterPropertyChangedCallback(dependencyProperty, token)); + }); + } + + private static PropertyInfo? ActuallyGetProperty(TypeInfo typeInfo, string propertyName) + { + var current = typeInfo; + while (current != null) + { + var ret = current.GetDeclaredProperty(propertyName); + if (ret?.IsStatic() == true) + { + return ret; + } + + current = current.BaseType?.GetTypeInfo(); + } + + return null; + } + + private static FieldInfo? ActuallyGetField(TypeInfo typeInfo, string propertyName) + { + var current = typeInfo; + while (current != null) + { + var ret = current.GetDeclaredField(propertyName); + if (ret?.IsStatic == true) + { + return ret; + } + + current = current.BaseType?.GetTypeInfo(); + } + + return null; + } + + private static Func? GetDependencyPropertyFetcher(Type type, string propertyName) + { + var typeInfo = type.GetTypeInfo(); + + // Look for the DependencyProperty attached to this property name + var pi = ActuallyGetProperty(typeInfo, propertyName + "Property"); + if (pi != null) + { + var value = pi.GetValue(null); + + if (value is null) + { + return null; + } + + return () => (DependencyProperty)value; + } + + var fi = ActuallyGetField(typeInfo, propertyName + "Property"); + if (fi != null) + { + var value = fi.GetValue(null); + + if (value is null) + { + return null; + } + + return () => (DependencyProperty)value; + } + + return null; + } + } +} diff --git a/src/ReactiveUI.WinUI/Registrations.cs b/src/ReactiveUI.WinUI/Registrations.cs index 444fe8bab1..a9662df043 100644 --- a/src/ReactiveUI.WinUI/Registrations.cs +++ b/src/ReactiveUI.WinUI/Registrations.cs @@ -24,10 +24,8 @@ public void Register(Action, Type> registerFunction) } registerFunction(() => new PlatformOperations(), typeof(IPlatformOperations)); - registerFunction(() => new ActivationForViewFetcher(), typeof(IActivationForViewFetcher)); - - // registerFunction(() => new DependencyObjectObservableForProperty(), typeof(ICreatesObservableForProperty)); + registerFunction(() => new DependencyObjectObservableForProperty(), typeof(ICreatesObservableForProperty)); registerFunction(() => new BooleanToVisibilityTypeConverter(), typeof(IBindingTypeConverter)); registerFunction(() => new AutoDataTemplateBindingHook(), typeof(IPropertyBindingHook)); registerFunction(() => new ComponentModelTypeConverter(), typeof(IBindingTypeConverter)); diff --git a/src/ReactiveUI.sln b/src/ReactiveUI.sln index 9e3a6f92a5..2a2ee18b4d 100644 --- a/src/ReactiveUI.sln +++ b/src/ReactiveUI.sln @@ -69,12 +69,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactiveUI.Uwp", "ReactiveU EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactiveUI.WinUI", "ReactiveUI.WinUI\ReactiveUI.WinUI.csproj", "{4FF9F04B-928E-47B6-836F-546B584F597C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Apps", "Apps", "{31006C9B-6477-47ED-9132-A2755F2CFB74}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactiveUI.WinUI.TestApp", "..\app\ReactiveUI.WinUI.TestApp\ReactiveUI.WinUI.TestApp.csproj", "{68F46362-EC2C-4B7B-8476-7B09341F7AB2}" -EndProject -Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "ReactiveUI.WinUI.TestApp (Package)", "..\app\ReactiveUI.WinUI.TestApp (Package)\ReactiveUI.WinUI.TestApp (Package).wapproj", "{BD7D8DF6-5774-4DD7-83E1-356977F11BEC}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -465,40 +459,6 @@ Global {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|x64.Build.0 = Release|Any CPU {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|x86.ActiveCfg = Release|Any CPU {4FF9F04B-928E-47B6-836F-546B584F597C}.Release|x86.Build.0 = Release|Any CPU - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|Any CPU.ActiveCfg = Debug|x86 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|arm64.ActiveCfg = Debug|arm64 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|arm64.Build.0 = Debug|arm64 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|x64.ActiveCfg = Debug|x64 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|x64.Build.0 = Debug|x64 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|x86.ActiveCfg = Debug|x86 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Debug|x86.Build.0 = Debug|x86 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|Any CPU.ActiveCfg = Release|x86 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|arm64.ActiveCfg = Release|arm64 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|arm64.Build.0 = Release|arm64 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|x64.ActiveCfg = Release|x64 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|x64.Build.0 = Release|x64 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|x86.ActiveCfg = Release|x86 - {68F46362-EC2C-4B7B-8476-7B09341F7AB2}.Release|x86.Build.0 = Release|x86 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|Any CPU.ActiveCfg = Debug|x86 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|arm64.ActiveCfg = Debug|arm64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|arm64.Build.0 = Debug|arm64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|arm64.Deploy.0 = Debug|arm64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x64.ActiveCfg = Debug|x64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x64.Build.0 = Debug|x64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x64.Deploy.0 = Debug|x64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x86.ActiveCfg = Debug|x86 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x86.Build.0 = Debug|x86 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Debug|x86.Deploy.0 = Debug|x86 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|Any CPU.ActiveCfg = Release|x86 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|arm64.ActiveCfg = Release|arm64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|arm64.Build.0 = Release|arm64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|arm64.Deploy.0 = Release|arm64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x64.ActiveCfg = Release|x64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x64.Build.0 = Release|x64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x64.Deploy.0 = Release|x64 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x86.ActiveCfg = Release|x86 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x86.Build.0 = Release|x86 - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC}.Release|x86.Deploy.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -528,8 +488,6 @@ Global {3C552CA0-C364-4E51-8825-35D082C1D5BA} = {EF7ED1B0-00E4-4CD0-9741-0D1D4463B8EC} {3684F9E6-BD5F-4C13-8DE8-FFCA8C62F439} = {EF7ED1B0-00E4-4CD0-9741-0D1D4463B8EC} {4FF9F04B-928E-47B6-836F-546B584F597C} = {EF7ED1B0-00E4-4CD0-9741-0D1D4463B8EC} - {68F46362-EC2C-4B7B-8476-7B09341F7AB2} = {31006C9B-6477-47ED-9132-A2755F2CFB74} - {BD7D8DF6-5774-4DD7-83E1-356977F11BEC} = {31006C9B-6477-47ED-9132-A2755F2CFB74} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9326B58C-0AD3-4527-B3F4-86B54673C62E} diff --git a/src/ReactiveUI/Mixins/DependencyResolverMixins.cs b/src/ReactiveUI/Mixins/DependencyResolverMixins.cs index 39bf2595ad..de1b8fe6ab 100644 --- a/src/ReactiveUI/Mixins/DependencyResolverMixins.cs +++ b/src/ReactiveUI/Mixins/DependencyResolverMixins.cs @@ -38,6 +38,7 @@ public static void InitializeReactiveUI(this IMutableDependencyResolver resolver { RegistrationNamespace.Drawing, "ReactiveUI.Drawing" }, { RegistrationNamespace.Maui, "ReactiveUI.Maui" }, { RegistrationNamespace.Uwp, "ReactiveUI.Uwp" }, + { RegistrationNamespace.WinUI, "ReactiveUI.WinUI" }, }; if (registrationNamespaces.Length == 0) diff --git a/src/ReactiveUI/RegistrationNamespace.cs b/src/ReactiveUI/RegistrationNamespace.cs index f9bf3f1627..304d6bb438 100644 --- a/src/ReactiveUI/RegistrationNamespace.cs +++ b/src/ReactiveUI/RegistrationNamespace.cs @@ -57,5 +57,10 @@ public enum RegistrationNamespace /// Uwp. /// Uwp, + + /// + /// WinUI. + /// + WinUI, } } From a20d7d895b03ad4d9f394d78b7446f886ebfbe59 Mon Sep 17 00:00:00 2001 From: Harvinder Singh Date: Mon, 23 Aug 2021 14:35:20 +1000 Subject: [PATCH 3/4] Updated DispatcherQueueScheduler xml docs --- .../DispatcherQueueScheduler.cs | 48 +++++++++---------- src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj | 1 - 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/ReactiveUI.WinUI/DispatcherQueueScheduler.cs b/src/ReactiveUI.WinUI/DispatcherQueueScheduler.cs index 29437f4d1a..6f17292d6a 100644 --- a/src/ReactiveUI.WinUI/DispatcherQueueScheduler.cs +++ b/src/ReactiveUI.WinUI/DispatcherQueueScheduler.cs @@ -11,7 +11,7 @@ namespace System.Reactive.Concurrency { /// - /// Represents an object that schedules units of work on a . + /// Represents an object that schedules units of work on a . /// /// /// This scheduler type is typically used indirectly through the and methods that use the Dispatcher on the calling thread. @@ -19,7 +19,7 @@ namespace System.Reactive.Concurrency public class DispatcherQueueScheduler : LocalScheduler, ISchedulerPeriodic { /// - /// Gets the scheduler that schedules work on the for the current thread. + /// Gets the scheduler that schedules work on the for the current thread. /// public static DispatcherQueueScheduler Current { @@ -36,33 +36,33 @@ public static DispatcherQueueScheduler Current } /// - /// Constructs a that schedules units of work on the given . + /// Constructs a that schedules units of work on the given . /// - /// to schedule work on. - /// is null. - public DispatcherQueueScheduler(DispatcherQueue dispatcher) + /// to schedule work on. + /// is null. + public DispatcherQueueScheduler(DispatcherQueue dispatcherQueue) { - Dispatcher = dispatcher ?? throw new ArgumentNullException(nameof(dispatcher)); + DispatcherQueue = dispatcherQueue ?? throw new ArgumentNullException(nameof(dispatcherQueue)); Priority = DispatcherQueuePriority.Normal; } /// - /// Constructs a that schedules units of work on the given at the given priority. + /// Constructs a that schedules units of work on the given at the given priority. /// - /// to schedule work on. + /// to schedule work on. /// Priority at which units of work are scheduled. - /// is null. - public DispatcherQueueScheduler(DispatcherQueue dispatcher, DispatcherQueuePriority priority) + /// is null. + public DispatcherQueueScheduler(DispatcherQueue dispatcherQueue, DispatcherQueuePriority priority) { - Dispatcher = dispatcher ?? throw new ArgumentNullException(nameof(dispatcher)); + DispatcherQueue = dispatcherQueue ?? throw new ArgumentNullException(nameof(dispatcherQueue)); Priority = priority; } /// - /// Gets the associated with the . + /// Gets the associated with the . /// - public DispatcherQueue Dispatcher { get; } + public DispatcherQueue DispatcherQueue { get; } /// /// Gets the priority at which work items will be dispatched. @@ -86,20 +86,20 @@ public override IDisposable Schedule(TState state, Func - { - if (!d.IsDisposed) - { - d.Disposable = action(this, state); - } + { + if (!d.IsDisposed) + { + d.Disposable = action(this, state); + } }); return d; } /// - /// Schedules an action to be executed after on the dispatcher, using a object. + /// Schedules an action to be executed after on the dispatcherQueue, using a object. /// /// The type of the state passed to the scheduled action. /// State passed to the action to be executed. @@ -127,7 +127,7 @@ private IDisposable ScheduleSlow(TState state, TimeSpan dueTime, Func { @@ -163,7 +163,7 @@ private IDisposable ScheduleSlow(TState state, TimeSpan dueTime, Func - /// Schedules a periodic piece of work on the dispatcher, using a object. + /// Schedules a periodic piece of work on the dispatcherQueue, using a object. /// /// The type of the state passed to the scheduled action. /// Initial state passed to the action upon the first iteration. @@ -184,7 +184,7 @@ public IDisposable SchedulePeriodic(TState state, TimeSpan period, Func< throw new ArgumentNullException(nameof(action)); } - var timer = Dispatcher.CreateTimer(); + var timer = DispatcherQueue.CreateTimer(); var state1 = state; diff --git a/src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj b/src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj index 7e446cdc68..a2621ab0ea 100644 --- a/src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj +++ b/src/ReactiveUI.WinUI/ReactiveUI.WinUI.csproj @@ -7,7 +7,6 @@ win10-x86;win10-x64 HAS_WINUI mvvm;reactiveui;rx;reactive extensions;observable;LINQ;events;winui - true true From 94a5d5a0de32102a1288420f930d1519cebbccec Mon Sep 17 00:00:00 2001 From: Harvinder Singh Date: Mon, 23 Aug 2021 14:38:58 +1000 Subject: [PATCH 4/4] Update .gitignore --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 2caf6d5a34..9faa066d62 100644 --- a/.gitignore +++ b/.gitignore @@ -369,5 +369,4 @@ src/Tools/ **/[Rr]esources/[Rr]esource.[Dd]esigner.cs # MSBuild generator editor configs -**/*.GeneratedMSBuildEditorConfig.editorconfig -/app +**/*.GeneratedMSBuildEditorConfig.editorconfig \ No newline at end of file