diff --git a/.github/ISSUE_TEMPLATE/maui_compat_bug_report_template.md b/.github/ISSUE_TEMPLATE/maui_compat_bug_report_template.md new file mode 100644 index 000000000..b30da4d7e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/maui_compat_bug_report_template.md @@ -0,0 +1,58 @@ +--- +name: Bug Report - Xamarin.CommunityToolkit.MauiCompat +about: Report a bug for Xamarin.CommunityToolkit.MauiCompat or Xamarin.CommunityToolkit.Markup.MauiCompat +title: "[Bug] [MauiCompat] " +labels: bug, unverified, maui-compat +assignees: '' + +--- + + + +### Description + + + +### Stack Trace + + + +### Link to Reproduction Sample + + + +### Steps to Reproduce + +1. +2. +3. + +### Expected Behavior + +### Actual Behavior + +### Basic Information + +- Version with issue: +- Last known good version: +- IDE: +- Platform Target Frameworks: + - iOS: + - Android: + - Windows: +- Android Support Library Version: +- Nuget Packages: +- Affected Devices: +- MAUI Version: + +### Workaround + + +### Reproduction imagery + + diff --git a/Directory.Build.props b/Directory.Build.props index 4e6c365e8..4555f8519 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ - 9.0 + latest enable nullable diff --git a/Libs/SourceGenerator/Xamarin.CommunityToolkit.SourceGenerator.dll b/Libs/SourceGenerator/Xamarin.CommunityToolkit.SourceGenerator.dll new file mode 100644 index 000000000..4f357c457 Binary files /dev/null and b/Libs/SourceGenerator/Xamarin.CommunityToolkit.SourceGenerator.dll differ diff --git a/MauiCompat.sh b/MauiCompat.sh index 1d16103ef..73e3b4aa0 100755 --- a/MauiCompat.sh +++ b/MauiCompat.sh @@ -7,11 +7,8 @@ dotnet sln ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat.sln add ./ dotnet new sln -o ./src/Markup/ -n Xamarin.CommunityToolkit.Markup.MauiCompat dotnet sln ./src/Markup/Xamarin.CommunityToolkit.Markup.MauiCompat.sln add ./src/Markup/Xamarin.CommunityToolkit.Markup.MauiCompat/Xamarin.CommunityToolkit.Markup.MauiCompat.csproj -sed -i '' 's/net6.0;//g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/Xamarin.CommunityToolkit.MauiCompat.csproj -sed -i '' 's/net6.0;//g' ./src/Markup/Xamarin.CommunityToolkit.Markup.MauiCompat/**/Xamarin.CommunityToolkit.Markup.MauiCompat.csproj - -sed -i '' 's/;net6.0-maccatalyst//g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/Xamarin.CommunityToolkit.MauiCompat.csproj -sed -i '' 's/;net6.0-maccatalyst//g' ./src/Markup/Xamarin.CommunityToolkit.Markup.MauiCompat/**/Xamarin.CommunityToolkit.Markup.MauiCompat.csproj +sed -i '' 's/enable/false/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/Xamarin.CommunityToolkit.MauiCompat.csproj +sed -i '' 's/enable/false/g' ./src/Markup/Xamarin.CommunityToolkit.Markup.MauiCompat/**/Xamarin.CommunityToolkit.Markup.MauiCompat.csproj printf > ./src/CommunityToolkit/Directory.build.props " @@ -35,7 +32,7 @@ printf > ./src/CommunityToolkit/Directory.build.props " true https://github.com/xamarin/XamarinCommunityToolkit false - 1.3.0-pre2 + 1.3.0-pre4 @@ -64,9 +61,18 @@ printf > ./src/CommunityToolkit/Directory.build.props " - - + + + + + + + + + \$(DefineConstants);NETSTANDARD + + " printf > ./src/Markup/Directory.build.props " @@ -90,7 +96,7 @@ printf > ./src/Markup/Directory.build.props " \$(AssemblyName) (\$(TargetFramework)) \$(Version)\$(VersionSuffix) true - 1.3.0-pre2 + 1.3.0-pre4 maui,net,xamarin,xamarin.forms,toolkit,kit,communitytoolkit,xamarincommunitytoolkit,markup,csharpformarkup,csharp,csharpmarkup @@ -270,6 +276,14 @@ sed -i '' 's/ConvertFromInvariantString(string value)/ConvertFrom(System.Compone sed -i '' 's/ConvertFromInvariantString(string\? value)/ConvertFrom(System.ComponentModel.ITypeDescriptorContext? context, System.Globalization.CultureInfo? culture, object valueObject)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/**.cs +sed -i '' 's/if (value != null)/if (valueObject is not string value){throw new InvalidOperationException("Only typeof(string) allowed");}if (value != null)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Helpers/SafeAreaTypeConverter.shared.cs + +sed -i '' 's/if (value == null)/if (valueObject is not string value){throw new InvalidOperationException("Only typeof(string) allowed");}if (value == null)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Core/MediaSourceConverter.shared.cs + +sed -i '' 's/return/if (valueObject is not string value){throw new InvalidOperationException("Only typeof(string) allowed");}return/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Core/FileMediaSourceConverter.shared.cs + +sed -i '' 's/return/if (valueObject is not string value){throw new InvalidOperationException("Only typeof(string) allowed");}return/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/MediaElement/UriTypeConverter.shared.cs + # Font sed -i '' '/else if (e.PropertyName == Label.FontProperty.PropertyName)/,+1d' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/**.cs @@ -318,9 +332,9 @@ sed -i '' 's/\tViewExtensions./\tMicrosoft.Maui.Controls.ViewExtensions./g' ./sr sed -i '' 's/ContainerView/Microsoft.Maui.Controls.Compatibility.Platform.Android.ContainerView/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/*.android.cs -sed -i '' 's/View.Context.ToPixels(/Microsoft.Maui.ContextExtensions.ToPixels(View.Context ?? throw new NullReferenceException(), /g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/*.android.cs -sed -i '' 's/Context.ToPixels(/Microsoft.Maui.ContextExtensions.ToPixels(Context, /g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/*.android.cs -sed -i '' 's/context.ToPixels(/Microsoft.Maui.ContextExtensions.ToPixels(context, /g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/*.android.cs +sed -i '' 's/View.Context.ToPixels(/Microsoft.Maui.Platform.ContextExtensions.ToPixels(View.Context ?? throw new NullReferenceException(), /g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/*.android.cs +sed -i '' 's/Context.ToPixels(/Microsoft.Maui.Platform.ContextExtensions.ToPixels(Context, /g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/*.android.cs +sed -i '' 's/context.ToPixels(/Microsoft.Maui.Platform.ContextExtensions.ToPixels(context, /g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/*.android.cs sed -i '' 's/Resource.Id/Xamarin.CommunityToolkit.MauiCompat.Resource.Id/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/*.android.cs sed -i '' 's/Resource.Layout/Xamarin.CommunityToolkit.MauiCompat.Resource.Layout/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/*.android.cs @@ -341,21 +355,21 @@ sed -i '' 's/children.ForEach(/Array.ForEach(children,/g' ./src/CommunityToolkit ## PlatformTouchEffect.ios.cs -sed -i '' 's/(isStarted ? color : control.BackgroundColor).ToCGColor()/Microsoft.Maui.ColorExtensions.ToCGColor(isStarted ? color : control.BackgroundColor)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/PlatformTouchEffect.ios.cs +sed -i '' 's/(isStarted ? color : control.BackgroundColor).ToCGColor()/Microsoft.Maui.Platform.ColorExtensions.ToCGColor(isStarted ? color : control.BackgroundColor)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/PlatformTouchEffect.ios.cs ## DrawingViewRenderer.ios.cs sed -i '' 's/void OnLinesCollectionChanged(object sender/void OnLinesCollectionChanged(object? sender/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/DrawingViewRenderer.ios.cs -sed -i '' 's/currentPoint.ToPoint()/CoreGraphicsExtensions.ToPoint(currentPoint)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/DrawingViewRenderer.ios.cs +sed -i '' 's/currentPoint.ToPoint()/Microsoft.Maui.Platform.CoreGraphicsExtensions.ToPoint(currentPoint)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/DrawingViewRenderer.ios.cs # DrawingViewService.ios.cs -sed -i '' 's/backgroundColor.ToCGColor()/Microsoft.Maui.ColorExtensions.ToCGColor(backgroundColor)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/DrawingViewService.ios.cs +sed -i '' 's/backgroundColor.ToCGColor()/Microsoft.Maui.Platform.ColorExtensions.ToCGColor(backgroundColor)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/DrawingViewService.ios.cs -sed -i '' 's/strokeColor.ToCGColor()/Microsoft.Maui.ColorExtensions.ToCGColor(strokeColor)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/DrawingViewService.ios.cs +sed -i '' 's/strokeColor.ToCGColor()/Microsoft.Maui.Platform.ColorExtensions.ToCGColor(strokeColor)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/DrawingViewService.ios.cs -sed -i '' 's/line.LineColor.ToCGColor()/Microsoft.Maui.ColorExtensions.ToCGColor(line.LineColor)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/DrawingViewService.ios.cs +sed -i '' 's/line.LineColor.ToCGColor()/Microsoft.Maui.Platform.ColorExtensions.ToCGColor(line.LineColor)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/DrawingViewService.ios.cs # SnackbarAppearance.ios.cs @@ -363,14 +377,13 @@ sed -i '' '1s/^/using Microsoft.Maui;using Microsoft.Maui.Controls.Compatibility sed -i '' 's/Forms.Font/Microsoft.Maui.Font/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/SnackbarAppearance.ios.cs +sed -i '' 's/color.A /color.Alpha /g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/SnackbarAppearance.ios.cs + # Snackbar.android.cs sed -i '' 's/await GetRendererWithRetries(sender)/(await GetRendererWithRetries(sender))?.View ?? sender.ToNative(sender.Handler.MauiContext)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/SnackBar.android.cs sed -i '' 's/renderer.View/renderer/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/SnackBar.android.cs - -# VisualFeedbackEffectRouter.ios.cs - -sed -i '' 's/color.A /color.Alpha /g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/SnackbarAppearance.ios.cs +sed -i '' 's/namespace/using Microsoft.Maui.Platform;namespace/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/SnackBar.android.cs # IconTintColorEffectRouter.android.cs @@ -402,7 +415,7 @@ sed -i '' 's/visualElementRenderer?.OnTouchEvent(e) is true || //g' ./src/Commun sed -i '' 's/static void MeasureExactly(AView control, VisualElement? element, Context? context)/static void MeasureExactly(AView control, VisualElement? element, Context context)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/CameraViewRenderer.android.cs -sed -i '' 's/Context.GetFragmentManager();/Microsoft.Maui.ContextExtensions.GetFragmentManager(Context ?? throw new NullReferenceException()) ?? throw new InvalidOperationException();/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/CameraViewRenderer.android.cs +sed -i '' 's/Context.GetFragmentManager();/Microsoft.Maui.Platform.ContextExtensions.GetFragmentManager(Context ?? throw new NullReferenceException()) ?? throw new InvalidOperationException();/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/CameraViewRenderer.android.cs # VisualElementExtension.shared.cs @@ -423,7 +436,7 @@ sed -i '' 's/nativeColor.Alpha/nativeColor.A/g' ./src/CommunityToolkit/Xamarin.C # PlatformShadowEffect.ios.macos.cs -sed -i '' 's/ShadowEffect.GetColor(Element).ToCGColor()/Microsoft.Maui.ColorExtensions.ToCGColor(ShadowEffect.GetColor(Element))/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/PlatformShadowEffect.ios.macos.cs +sed -i '' 's/ShadowEffect.GetColor(Element).ToCGColor()/Microsoft.Maui.Platform.ColorExtensions.ToCGColor(ShadowEffect.GetColor(Element))/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/PlatformShadowEffect.ios.macos.cs sed -i '' 's/using Xamarin.CommunityToolkit.Android.Effects;/using System;using Xamarin.CommunityToolkit.Android.Effects;/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/PlatformShadowEffect.android.cs @@ -487,3 +500,88 @@ sed -i '' 's/Xamarin.Forms.RelativeLayout/Microsoft.Maui.Controls.Compatibility. sed -i '' 's/Xamarin.Forms.View/Microsoft.Maui.Controls.View/g' ./src/Markup/Xamarin.CommunityToolkit.Markup.MauiCompat/RelativeLayout.cs sed -i '' 's/Xamarin.Forms.Constraint/Microsoft.Maui.Controls.Compatibility.Constraint/g' ./src/Markup/Xamarin.CommunityToolkit.Markup.MauiCompat/RelativeLayout.cs sed -i '' 's/using Microsoft.Maui.Controls.Compatibility;/using Microsoft.Maui.Controls.Compatibility;using Grid = Microsoft.Maui.Controls.Grid;/g' ./src/Markup/Xamarin.CommunityToolkit.Markup.MauiCompat/ViewInGridExtensions.cs + +# MauiColorExtensions +printf > ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Extensions/MauiColorExtensions.android.cs " +using AColor = Android.Graphics.Color; + +namespace Xamarin.CommunityToolkit.MauiCompat +{ + public static partial class MauiColorExtensions + { + public static AColor ToAndroid(this Microsoft.Maui.Graphics.Color self) + { + var colorToConvert = self; + + if (colorToConvert == null) + { + colorToConvert = Microsoft.Maui.Graphics.Colors.Transparent; + } + + return Microsoft.Maui.Controls.Compatibility.Platform.Android.ColorExtensions.ToAndroid(colorToConvert); + } + } +}" + +printf > ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Extensions/MauiColorExtensions.ios.cs " +using iColor = UIKit.UIColor; + +namespace Xamarin.CommunityToolkit.MauiCompat +{ + public static partial class MauiColorExtensions + { + public static iColor ToUIColor(this Microsoft.Maui.Graphics.Color self) + { + var colorToConvert = self; + if (colorToConvert == null) + { + colorToConvert = Microsoft.Maui.Graphics.Colors.Transparent; + } + + return Microsoft.Maui.Controls.Compatibility.Platform.iOS.ColorExtensions.ToUIColor(colorToConvert); + } + } +}" + +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Effects/IconTintColor/IconTintColorEffectRouter.ios.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Effects/StatusBar/PlatformStatusBarEffect.ios.cs +sed -i '' 's/\[Foundation.Preserve(AllMembers = true)/using Xamarin.CommunityToolkit.MauiCompat; \[Foundation.Preserve(AllMembers = true)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Effects/VisualFeedback/VisualFeedbackEffectRouter.ios.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/DrawingView/Renderer/DrawingViewRenderer.ios.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/MediaElement/iOS/MediaElementRenderer.ios.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/Popup/iOS/PopupRenderer.ios.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/Snackbar/SnackBar.ios.macos.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/Snackbar/Helpers/iOS/SnackBarAppearance.ios.cs + +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Effects/IconTintColor/IconTintColorEffectRouter.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Effects/Shadow/PlatformShadowEffect.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Effects/StatusBar/PlatformStatusBarEffect.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Effects/Touch/PlatformTouchEffect.android.cs +sed -i '' 's/\[Microsoft.Maui.Controls.Internals.Preserve(AllMembers = true)/using Xamarin.CommunityToolkit.MauiCompat; \[Microsoft.Maui.Controls.Internals.Preserve(AllMembers = true)/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Effects/VisualFeedback/VisualFeedbackEffectRouter.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/PlatformConfiguration/AndroidSpecific/NavigationBar/PlatformNavigationBarEffect.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/CameraView/Android/CameraFragment.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/DrawingView/Renderer/DrawingViewRenderer.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/DrawingView/Service/DrawingViewService.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/MediaElement/Android/MediaElementRenderer.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/Snackbar/SnackBar.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/ViewSwitcher/BackgroundManager.android.cs +sed -i '' 's/public class/using Xamarin.CommunityToolkit.MauiCompat; public class/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Views/ViewSwitcher/TextSwitcherRenderer.android.cs + +# StreamMediaSource + +sed -i '' 's/readonly object synchandle = new object();/public bool IsEmpty => Stream == null; readonly object synchandle = new object();/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/Core/StreamMediaSource.shared.cs + +# nfloat + +sed -i '' 's/nfloat/ObjCRuntime.nfloat/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/**.cs + +# AVMediaType + +sed -i '' 's/photoOutput.ConnectionFromMediaType(AVMediaType.Video)/photoOutput.ConnectionFromMediaType(new NSString("video"))/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/**.cs +sed -i '' 's/AVCaptureDevice.DevicesWithMediaType(AVMediaType.Video)/AVCaptureDevice.DevicesWithMediaType("video")/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/**.cs +sed -i '' 's/AVMediaType.Audio/AVMediaTypes.Audio/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/**.cs +sed -i '' 's/AVMediaType.Video/AVAuthorizationMediaType.Video/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/**.cs + +# Log + +sed -i '' 's/using System;/using System;using Microsoft.Extensions.Logging;/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/**.cs +sed -i '' 's/Log\./(Microsoft.Maui.Controls.Application.Current?.Handler.MauiContext?.Services.GetService(typeof(ILogger)) as ILogger)?.Log/g' ./src/CommunityToolkit/Xamarin.CommunityToolkit.MauiCompat/**/**.cs \ No newline at end of file diff --git a/MauiCompatSteps.md b/MauiCompatSteps.md index 07b3972c6..639137a07 100644 --- a/MauiCompatSteps.md +++ b/MauiCompatSteps.md @@ -22,96 +22,13 @@ The following steps are used to create the MauiCompat libraries zsh ./MauiCompat.sh ``` -### 3. Manually Update TypeConverters - -In .NET 6, `System.ComponentModel.TypeConverter` requires us to override `ConvertFrom` which uses `object value` as a parameter. - -Previously, in .NET Standard we used `ConvertFromInvariantString(string value)`. - -To create the MauiCompat library, we must update the logic in each converter to handle an object instead of a string. - -Start by adding the following line: - -```cs -if (valueObject is not string value) - throw new InvalidOperationException("Only typeof(string) allowed"); -``` - -- [ ] FileMediaSourceConverter.shared.cs -- [ ] MediaSourceConverter.shared.cs -- [ ] SafeAreaTypeConverter.shared.cs -- [ ] UriTypeConverter.shared.cs - -### 4. Manually Update `IStreamImageConverter` - -`Microsoft.Maui.IStreamImageConverter` adds a new API, `public bool IsEmpty { get; }`. - -Add the following code to implement the new API: - -```cs -public bool IsEmpty => Stream == null; -``` - -- [ ] StreamMediaSource.shared.cs - -### 5. Add MauiColorExtensions Classes +### 3. Add MauiColorExtensions Classes In .NET MAUI the `Color` object has been changed from a `struct` to an `object`. Because of that, we now need to be aware of passing `null` values on methods that have to do with colors. For instance, the `ToAndroid()` and `ToUIColor()` extension methods that take a .NET MAUI `Color` and convert it into a native platform color. There are multiple ways to solve this, but we chose to overload these extension methods with our own. This method checks if the incoming color is `null`, if it is, we replace the color with `Colors.Transparent` and pass it to the extension method and return its value. This way we didn't need to edit all the lines with this extension method individually. -#### 5.1 Create `MauiColorExtensions.android.cs` -The code looks like underneath. - -```cs -using AColor = Android.Graphics.Color; - -namespace Xamarin.CommunityToolkit.MauiCompat -{ - public static partial class MauiColorExtensions - { - public static AColor ToAndroid(this Microsoft.Maui.Graphics.Color self) - { - var colorToConvert = self; - - if (colorToConvert == null) - { - colorToConvert = Microsoft.Maui.Graphics.Colors.Transparent; - } - - return Microsoft.Maui.Controls.Compatibility.Platform.Android.ColorExtensions.ToAndroid(colorToConvert); - } - } -} -``` - -#### 5.2 Create `MauiColorExtensions.ios.cs` -The code looks like underneath. - -```cs -using iColor = UIKit.UIColor; - -namespace Xamarin.CommunityToolkit.MauiCompat -{ - public static partial class MauiColorExtensions - { - public static iColor ToUIColor(this Microsoft.Maui.Graphics.Color self) - { - var colorToConvert = self; - - if (colorToConvert == null) - { - colorToConvert = Microsoft.Maui.Graphics.Colors.Transparent; - } - - return Microsoft.Maui.Controls.Compatibility.Platform.iOS.ColorExtensions.ToUIColor(colorToConvert); - } - } -} - -``` - -#### 5.3 Add `using` Statement to Files Which Reference Original Extension Methods +#### 3.1 Add `using` Statement to Files Which Reference Original Extension Methods Now in each file that references the `ToAndroid()` and `ToUIColor()` methods we need to add the `using Xamarin.CommunityToolkit.MauiCompat;` line to make sure that it uses _our_ extension method. There is one catch: you have to declare this using **inside** the namespace declaration so that it will prefer _our_ extension method over the .NET MAUI one. In example: ```cs @@ -130,7 +47,7 @@ namespace Xamarin.CommunityToolkit.UI.Views public class DrawingViewRenderer : ViewRenderer { } ``` -### 6. Build projects +### 4. Build projects ```zsh dotnet build ./src/Markup/Xamarin.CommunityToolkit.Markup.MauiCompat.sln -c Release diff --git a/Xamarin.CommunityToolkit.All.sln b/Xamarin.CommunityToolkit.All.sln index 77ec6c726..97543bf74 100644 --- a/Xamarin.CommunityToolkit.All.sln +++ b/Xamarin.CommunityToolkit.All.sln @@ -1,12 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31019.210 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.31903.286 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit", "src\CommunityToolkit\Xamarin.CommunityToolkit\Xamarin.CommunityToolkit.csproj", "{1B9B44A1-281F-4854-8DA9-4679A34593BB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit.Markup", "src\Markup\Xamarin.CommunityToolkit.Markup\Xamarin.CommunityToolkit.Markup.csproj", "{ED6D1344-7A87-4DCF-BBA3-13E319108C56}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit.SourceGenerator", "src\SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator.csproj", "{13195939-6F8A-4991-B42A-C13DE7ED1EB6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {ED6D1344-7A87-4DCF-BBA3-13E319108C56}.Debug|Any CPU.Build.0 = Debug|Any CPU {ED6D1344-7A87-4DCF-BBA3-13E319108C56}.Release|Any CPU.ActiveCfg = Release|Any CPU {ED6D1344-7A87-4DCF-BBA3-13E319108C56}.Release|Any CPU.Build.0 = Release|Any CPU + {13195939-6F8A-4991-B42A-C13DE7ED1EB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {13195939-6F8A-4991-B42A-C13DE7ED1EB6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {13195939-6F8A-4991-B42A-C13DE7ED1EB6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {13195939-6F8A-4991-B42A-C13DE7ED1EB6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/azure-pipelines.yml b/azure-pipelines.yml index e8c573e09..3b08833bd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -196,32 +196,29 @@ jobs: pool: vmImage: macos-11 steps: - - powershell: | - $mauiCompatExists = Test-Path -Path "$(PathToMauiCompatCommunityToolkitCsproj)" - Write-Output "##vso[task.setvariable variable=MauiCompatExists]$mauiCompatExists" - task: UseDotNet@2 - condition: eq (variables['MauiCompatExists'], True) displayName: 'Install .NET SDK' inputs: version: $(NETCORE_VERSION) includePreviewVersions: false - task: CmdLine@2 - condition: eq (variables['MauiCompatExists'], True) displayName: 'Install .NET MAUI workload' inputs: script: 'dotnet workload install maui' - task: JavaToolInstaller@0 - condition: eq (variables['MauiCompatExists'], True) displayName: 'Install Java SDK 11.0' inputs: versionSpec: '11' jdkArchitectureOption: 'x64' jdkSourceOption: 'PreInstalled' + - powershell: | + $mauiCompatExists = Test-Path -Path "$(PathToMauiCompatCommunityToolkitCsproj)" + Write-Output "##vso[task.setvariable variable=MauiCompatExists]$mauiCompatExists" - task: CmdLine@2 - condition: eq (variables['MauiCompatExists'], True) - displayName: 'Clear Local NuGet Cache' #https://github.com/actions/virtual-environments/issues/1090#issuecomment-748452120 + displayName: 'Run MauiCompat Generator' + condition: eq (variables['MauiCompatExists'], False) inputs: - script: 'nuget locals all -clear' + script: 'zsh ./MauiCompat.sh' # if this is a tagged build, then update the version number - powershell: | $buildSourceBranch = "$(Build.SourceBranch)" @@ -229,36 +226,30 @@ jobs: Write-Host("Branch = $buildSourceBranch, Version = $tagVersion"); Write-Host ("##vso[task.setvariable variable=NugetPackageVersion;]$tagVersion") displayName: Set NuGet Version to Tag Number - condition: and(eq (variables['MauiCompatExists'], True), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/') # restore, build and pack the packages - task: CmdLine@2 - condition: eq (variables['MauiCompatExists'], True) displayName: 'Build Xamarin.CommunityToolkit.MauiCompat.csproj' inputs: script: 'dotnet build $(PathToMauiCompatCommunityToolkitCsproj) -c Release /p:ContinuousIntegrationBuild=true /p:Deterministic=false' - task: CopyFiles@2 - condition: eq (variables['MauiCompatExists'], True) inputs: Contents: 'SignList.xml' TargetFolder: '$(Build.ArtifactStagingDirectory)/nuget' - task: CmdLine@2 - condition: eq (variables['MauiCompatExists'], True) displayName: 'Pack Community Toolkit NuGets' inputs: script: 'dotnet pack $(PathToMauiCompatCommunityToolkitCsproj) -c Release /p:PackageVersion=$(NugetPackageVersion) /p:PackageOutputPath="$(Build.ArtifactStagingDirectory)/nuget"' - task: CmdLine@2 - condition: eq (variables['MauiCompatExists'], True) displayName: 'Build Markup Project' inputs: script: 'dotnet build $(PathToMauiCompatMarkupCsproj) -c Release /p:ContinuousIntegrationBuild=true /p:Deterministic=false' - task: CmdLine@2 - condition: eq (variables['MauiCompatExists'], True) displayName: 'Pack Markup NuGet' inputs: script: 'dotnet pack $(PathToMauiCompatMarkupCsproj) -c Release /p:PackageVersion=$(NugetPackageVersion) /p:PackageOutputPath="$(Build.ArtifactStagingDirectory)/nuget"' # publish the packages - task: PublishBuildArtifacts@1 - condition: eq (variables['MauiCompatExists'], True) displayName: 'Publish Unsigned NuGets' inputs: artifactName: nuget diff --git a/global.json b/global.json new file mode 100644 index 000000000..e45c132ea --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "6.0.*", + "rollForward": "latestMajor" + } +} diff --git a/samples/XCT.Sample.Android/Xamarin.CommunityToolkit.Sample.Android.csproj b/samples/XCT.Sample.Android/Xamarin.CommunityToolkit.Sample.Android.csproj index c6b2498ef..c5e0c009f 100644 --- a/samples/XCT.Sample.Android/Xamarin.CommunityToolkit.Sample.Android.csproj +++ b/samples/XCT.Sample.Android/Xamarin.CommunityToolkit.Sample.Android.csproj @@ -32,6 +32,12 @@ DEBUG; prompt 4 + false + false + false + false + false + true diff --git a/samples/XCT.Sample.WPF/DrawingViewRenderer.wpf.cs b/samples/XCT.Sample.WPF/DrawingViewRenderer.wpf.cs index e6f927c49..e38e8eb51 100644 --- a/samples/XCT.Sample.WPF/DrawingViewRenderer.wpf.cs +++ b/samples/XCT.Sample.WPF/DrawingViewRenderer.wpf.cs @@ -90,7 +90,7 @@ void OnStrokesChanged(object sender, StrokeCollectionChangedEventArgs e) Element.Lines.Clear(); } - var lines = Element.MultiLineMode ? e.Added : new StrokeCollection() {e.Added.First()}; + var lines = Element.MultiLineMode ? e.Added : new StrokeCollection() { e.Added.First() }; foreach (var line in lines) { @@ -100,7 +100,7 @@ void OnStrokesChanged(object sender, StrokeCollectionChangedEventArgs e) Points = new ObservableCollection(points), LineColor = Color.FromRgba(line.DrawingAttributes.Color.R, line.DrawingAttributes.Color.G, line.DrawingAttributes.Color.B, line.DrawingAttributes.Color.A), - LineWidth = (float) line.DrawingAttributes.Width + LineWidth = (float)line.DrawingAttributes.Width }); } @@ -127,12 +127,12 @@ void LoadLines() var lines = Element.MultiLineMode ? Element.Lines : Element.Lines.Any() - ? new ObservableCollection {Element.Lines.LastOrDefault()} + ? new ObservableCollection { Element.Lines.LastOrDefault() } : new ObservableCollection(); foreach (var line in lines) { var stylusPoints = line.Points.Select(point => new StylusPoint(point.X, point.Y)).ToList(); - if (stylusPoints is {Count: > 0}) + if (stylusPoints is { Count: > 0 }) { var stroke = new Stroke(new StylusPointCollection(stylusPoints)) { diff --git a/samples/XCT.Sample.sln b/samples/XCT.Sample.sln index e5d4acc60..260582d63 100644 --- a/samples/XCT.Sample.sln +++ b/samples/XCT.Sample.sln @@ -21,6 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\.editorconfig = ..\.editorconfig ..\Directory.Build.props = ..\Directory.Build.props ..\Xamarin.CommunityToolkit.ruleset = ..\Xamarin.CommunityToolkit.ruleset + ..\global.json = ..\global.json EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.CommunityToolkit.Sample.WPF", "XCT.Sample.WPF\Xamarin.CommunityToolkit.Sample.WPF.csproj", "{C4D6CD2D-8DF4-4D46-936C-1AB31C87B5EA}" @@ -31,9 +32,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit.Sa EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit.Markup", "..\src\Markup\Xamarin.CommunityToolkit.Markup\Xamarin.CommunityToolkit.Markup.csproj", "{A5AAB927-15D7-498C-8295-4209F21836CE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.CommunityToolkit.Markup.UnitTests", "..\src\Markup\Xamarin.CommunityToolkit.Markup.UnitTests\Xamarin.CommunityToolkit.Markup.UnitTests.csproj", "{AAE423C4-E9B4-434E-885C-2164C12BF79C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.CommunityToolkit.Markup.UnitTests", "..\src\Markup\Xamarin.CommunityToolkit.Markup.UnitTests\Xamarin.CommunityToolkit.Markup.UnitTests.csproj", "{AAE423C4-E9B4-434E-885C-2164C12BF79C}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Xamarin.CommunityToolkit.Sample.FSharp", "XCT.Sample.FSharp\Xamarin.CommunityToolkit.Sample.FSharp.fsproj", "{D5C2D19A-E929-4587-A9DE-FA50E46AAB59}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Xamarin.CommunityToolkit.Sample.FSharp", "XCT.Sample.FSharp\Xamarin.CommunityToolkit.Sample.FSharp.fsproj", "{D5C2D19A-E929-4587-A9DE-FA50E46AAB59}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.CommunityToolkit.SourceGenerator", "..\src\SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator\Xamarin.CommunityToolkit.SourceGenerator.csproj", "{47143F45-FF3B-4F74-9697-212886E9967E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -353,6 +356,30 @@ Global {D5C2D19A-E929-4587-A9DE-FA50E46AAB59}.Release|x64.Build.0 = Release|Any CPU {D5C2D19A-E929-4587-A9DE-FA50E46AAB59}.Release|x86.ActiveCfg = Release|Any CPU {D5C2D19A-E929-4587-A9DE-FA50E46AAB59}.Release|x86.Build.0 = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|ARM.Build.0 = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|iPhone.Build.0 = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|x64.ActiveCfg = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|x64.Build.0 = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|x86.ActiveCfg = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Debug|x86.Build.0 = Debug|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|Any CPU.Build.0 = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|ARM.ActiveCfg = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|ARM.Build.0 = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|iPhone.ActiveCfg = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|iPhone.Build.0 = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|x64.ActiveCfg = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|x64.Build.0 = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|x86.ActiveCfg = Release|Any CPU + {47143F45-FF3B-4F74-9697-212886E9967E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/samples/XCT.Sample/App.xaml.cs b/samples/XCT.Sample/App.xaml.cs index 40b477f83..5169046e0 100644 --- a/samples/XCT.Sample/App.xaml.cs +++ b/samples/XCT.Sample/App.xaml.cs @@ -22,4 +22,4 @@ public App() MainPage = new BaseNavigationPage(new WelcomePage()); } } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Animations/AnimationPage.xaml.cs b/samples/XCT.Sample/Pages/Animations/AnimationPage.xaml.cs index 88fa3fe3c..9d4948a5e 100644 --- a/samples/XCT.Sample/Pages/Animations/AnimationPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Animations/AnimationPage.xaml.cs @@ -7,4 +7,4 @@ public AnimationPage() InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Behaviors/AnimationBehaviorPage.xaml.cs b/samples/XCT.Sample/Pages/Behaviors/AnimationBehaviorPage.xaml.cs index 5893a66cd..710e244fb 100644 --- a/samples/XCT.Sample/Pages/Behaviors/AnimationBehaviorPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Behaviors/AnimationBehaviorPage.xaml.cs @@ -3,5 +3,5 @@ public partial class AnimationBehaviorPage : BasePage { public AnimationBehaviorPage() => InitializeComponent(); - } + } } \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/BoolToObjectConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/BoolToObjectConverterPage.xaml.cs index eca12a485..be78296f7 100644 --- a/samples/XCT.Sample/Pages/Converters/BoolToObjectConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/BoolToObjectConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class BoolToObjectConverterPage { public BoolToObjectConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/CompareConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/CompareConverterPage.xaml.cs index d5ae381b0..fda32008b 100644 --- a/samples/XCT.Sample/Pages/Converters/CompareConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/CompareConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class CompareConverterPage : BasePage { public CompareConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/DoubleToIntConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/DoubleToIntConverterPage.xaml.cs index fd29fb21d..47888a804 100644 --- a/samples/XCT.Sample/Pages/Converters/DoubleToIntConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/DoubleToIntConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class DoubleToIntConverterPage { public DoubleToIntConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/EnumToBoolConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/EnumToBoolConverterPage.xaml.cs index bad3953b4..4c52e5833 100644 --- a/samples/XCT.Sample/Pages/Converters/EnumToBoolConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/EnumToBoolConverterPage.xaml.cs @@ -1,7 +1,7 @@ namespace Xamarin.CommunityToolkit.Sample.Pages.Converters { - public partial class EnumToBoolConverterPage - { - public EnumToBoolConverterPage() => InitializeComponent(); - } + public partial class EnumToBoolConverterPage + { + public EnumToBoolConverterPage() => InitializeComponent(); + } } \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/EnumToIntConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/EnumToIntConverterPage.xaml.cs index 135f5e15a..9b6c0a2dc 100644 --- a/samples/XCT.Sample/Pages/Converters/EnumToIntConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/EnumToIntConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class EnumToIntConverterPage { public EnumToIntConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/EqualConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/EqualConverterPage.xaml.cs index 231772eea..fcea233b0 100644 --- a/samples/XCT.Sample/Pages/Converters/EqualConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/EqualConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class EqualConverterPage { public EqualConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/IndexToArrayItemConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/IndexToArrayItemConverterPage.xaml.cs index ba36595f5..8762fe51b 100644 --- a/samples/XCT.Sample/Pages/Converters/IndexToArrayItemConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/IndexToArrayItemConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class IndexToArrayItemConverterPage { public IndexToArrayItemConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/IntToBoolConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/IntToBoolConverterPage.xaml.cs index 669fe5f66..44a3c6859 100644 --- a/samples/XCT.Sample/Pages/Converters/IntToBoolConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/IntToBoolConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class IntToBoolConverterPage { public IntToBoolConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/InvertedBoolConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/InvertedBoolConverterPage.xaml.cs index 9c338ea2e..b87871dc3 100644 --- a/samples/XCT.Sample/Pages/Converters/InvertedBoolConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/InvertedBoolConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class InvertedBoolConverterPage { public InvertedBoolConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/IsInRangeConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/IsInRangeConverterPage.xaml.cs index cb7f47840..f2813a81e 100644 --- a/samples/XCT.Sample/Pages/Converters/IsInRangeConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/IsInRangeConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class IsInRangeConverterPage { public IsInRangeConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/IsNotNullOrEmptyConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/IsNotNullOrEmptyConverterPage.xaml.cs index b3a0d5c36..f7601888c 100644 --- a/samples/XCT.Sample/Pages/Converters/IsNotNullOrEmptyConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/IsNotNullOrEmptyConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class IsNotNullOrEmptyConverterPage { public IsNotNullOrEmptyConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/IsNullOrEmptyConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/IsNullOrEmptyConverterPage.xaml.cs index 36c58fc8c..46b9b2ba5 100644 --- a/samples/XCT.Sample/Pages/Converters/IsNullOrEmptyConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/IsNullOrEmptyConverterPage.xaml.cs @@ -7,4 +7,4 @@ public IsNullOrEmptyConverterPage() InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/ListIsNotNullOrEmptyConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/ListIsNotNullOrEmptyConverterPage.xaml.cs index aabc31185..f40ce9ab9 100644 --- a/samples/XCT.Sample/Pages/Converters/ListIsNotNullOrEmptyConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/ListIsNotNullOrEmptyConverterPage.xaml.cs @@ -7,4 +7,4 @@ public ListIsNotNullOrEmptyConverterPage() InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/ListToStringConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/ListToStringConverterPage.xaml.cs index 4280638e0..40afe13fc 100644 --- a/samples/XCT.Sample/Pages/Converters/ListToStringConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/ListToStringConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class ListToStringConverterPage { public ListToStringConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/MathExpressionConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/MathExpressionConverterPage.xaml.cs index 5d054a575..c9a29b03d 100644 --- a/samples/XCT.Sample/Pages/Converters/MathExpressionConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/MathExpressionConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class MathExpressionConverterPage { public MathExpressionConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/NotEqualConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/NotEqualConverterPage.xaml.cs index e1d362d38..40d297fae 100644 --- a/samples/XCT.Sample/Pages/Converters/NotEqualConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/NotEqualConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class NotEqualConverterPage { public NotEqualConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/StringToListConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/StringToListConverterPage.xaml.cs index 77597b496..da642e8b5 100644 --- a/samples/XCT.Sample/Pages/Converters/StringToListConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/StringToListConverterPage.xaml.cs @@ -7,4 +7,4 @@ public StringToListConverterPage() InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Converters/TextCaseConverterPage.xaml.cs b/samples/XCT.Sample/Pages/Converters/TextCaseConverterPage.xaml.cs index 8018c6196..ae09572f6 100644 --- a/samples/XCT.Sample/Pages/Converters/TextCaseConverterPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Converters/TextCaseConverterPage.xaml.cs @@ -4,4 +4,4 @@ public partial class TextCaseConverterPage { public TextCaseConverterPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Effects/ShadowEffectPage.xaml.cs b/samples/XCT.Sample/Pages/Effects/ShadowEffectPage.xaml.cs index d8e62916b..73e092960 100644 --- a/samples/XCT.Sample/Pages/Effects/ShadowEffectPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Effects/ShadowEffectPage.xaml.cs @@ -4,4 +4,4 @@ public partial class ShadowEffectPage { public ShadowEffectPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Effects/StatusBarEffectPage.xaml.cs b/samples/XCT.Sample/Pages/Effects/StatusBarEffectPage.xaml.cs index 0965607c9..3371e20d9 100644 --- a/samples/XCT.Sample/Pages/Effects/StatusBarEffectPage.xaml.cs +++ b/samples/XCT.Sample/Pages/Effects/StatusBarEffectPage.xaml.cs @@ -4,4 +4,4 @@ public partial class StatusBarEffectPage { public StatusBarEffectPage() => InitializeComponent(); } -} +} \ No newline at end of file diff --git a/samples/XCT.Sample/Pages/Extensions/SemanticExtensionsPage.xaml b/samples/XCT.Sample/Pages/Extensions/SemanticExtensionsPage.xaml new file mode 100644 index 000000000..4a3772b3a --- /dev/null +++ b/samples/XCT.Sample/Pages/Extensions/SemanticExtensionsPage.xaml @@ -0,0 +1,35 @@ + + + + +