From b3eae4521547bbdc3c98853720ec9f99f0b39258 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 4 Aug 2025 17:05:45 -0500 Subject: [PATCH 01/28] Fix iOS Custom Entitlements File Not Respected in Single Project Templates (#30275) * Initial plan * Fix iOS Custom Entitlements File override issue - respect user-defined CodesignEntitlements Co-authored-by: jfversluis <939291+jfversluis@users.noreply.github.com> * Add MSBuild tests for CodesignEntitlements fix - Added SingleProject_CodesignEntitlementsRespected test to verify custom CodesignEntitlements property is preserved - Added SingleProject_DefaultEntitlementsUsedWhenNoCustomSet test to verify default behavior still works - Tests validate the fix for issue #30221 where custom entitlements were being overridden Co-authored-by: rmarinho <1235097+rmarinho@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jfversluis <939291+jfversluis@users.noreply.github.com> Co-authored-by: rmarinho <1235097+rmarinho@users.noreply.github.com> --- ...Maui.Controls.SingleProject.Before.targets | 4 +- .../Xaml.UnitTests/MSBuild/MSBuildTests.cs | 103 ++++++++++++++++++ 2 files changed, 105 insertions(+), 2 deletions(-) diff --git a/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.Before.targets b/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.Before.targets index e39f88f4bda2..17b91db2f42b 100644 --- a/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.Before.targets +++ b/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.Before.targets @@ -44,13 +44,13 @@ $(iOSProjectFolder)Resources - $(iOSProjectFolder)Entitlements.plist + $(iOSProjectFolder)Entitlements.plist <_SingleProjectiOSExcludes>$(iOSProjectFolder)/**/.*/** $(MacCatalystProjectFolder)Resources - $(MacCatalystProjectFolder)Entitlements.plist + $(MacCatalystProjectFolder)Entitlements.plist <_SingleProjectMacCatalystExcludes>$(MacCatalystProjectFolder)/**/.*/** diff --git a/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs b/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs index 23bea48b6a68..ea66d39fe311 100644 --- a/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs +++ b/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs @@ -497,5 +497,108 @@ public void NoXamlFiles() var log = Build(projectFile, verbosity: "diagnostic"); Assert.IsTrue(log.Contains("Target \"XamlC\" skipped", StringComparison.Ordinal), "XamlC should be skipped if there are no .xaml files."); } + + /// + /// Tests that the SingleProject Before targets respect custom CodesignEntitlements properties + /// + [Test] + public void SingleProject_CodesignEntitlementsRespected() + { + // Create a minimal project for property evaluation testing only + var project = NewElement("Project").WithAttribute("Sdk", "Microsoft.NET.Sdk"); + + // Add PropertyGroup with test properties + var propertyGroup = NewElement("PropertyGroup"); + propertyGroup.Add(NewElement("TargetFramework").WithValue(GetTfm())); + propertyGroup.Add(NewElement("SingleProject").WithValue("true")); + + // Test scenario 1: Custom CodesignEntitlements should be preserved + propertyGroup.Add(NewElement("CodesignEntitlements").WithValue("Custom\\Entitlements.plist")); + propertyGroup.Add(NewElement("iOSProjectFolder").WithValue("Platforms\\iOS\\")); + propertyGroup.Add(NewElement("MacCatalystProjectFolder").WithValue("Platforms\\MacCatalyst\\")); + project.Add(propertyGroup); + + // Add import for the SingleProject Before targets we're testing + var targetsPath = AssemblyInfoTests.GetFilePathFromRoot(IOPath.Combine("src", "Controls", "src", "Build.Tasks", "nuget", "buildTransitive", "netstandard2.0", "Microsoft.Maui.Controls.SingleProject.Before.targets")); + var import = NewElement("Import") + .WithAttribute("Project", targetsPath); + project.Add(import); + + // Create the entitlements files + project.Add(AddFile("Platforms\\iOS\\Entitlements.plist", "None", "\n")); + project.Add(AddFile("Custom\\Entitlements.plist", "None", "\n")); + + // Add a target to output the CodesignEntitlements property value for verification + var target = NewElement("Target").WithAttribute("Name", "TestCodesignEntitlements"); + target.Add(NewElement("Message") + .WithAttribute("Text", "CodesignEntitlements = $(CodesignEntitlements)") + .WithAttribute("Importance", "high")); + project.Add(target); + + var projectFile = IOPath.Combine(tempDirectory, "test.csproj"); + project.Save(projectFile); + + // Build the test target to see property evaluation + var log = Build(projectFile, target: "TestCodesignEntitlements", verbosity: "normal"); + + // Verify the custom CodesignEntitlements property is preserved + Assert.IsTrue(log.Contains("CodesignEntitlements = Custom/Entitlements.plist", StringComparison.Ordinal) || + log.Contains("CodesignEntitlements = Custom\\Entitlements.plist", StringComparison.Ordinal), + "Custom CodesignEntitlements property should be preserved and not overridden by default Entitlements.plist"); + } + + /// + /// Tests that the SingleProject Before targets use default Entitlements.plist when no custom CodesignEntitlements is set + /// + [Test] + public void SingleProject_DefaultEntitlementsUsedWhenNoCustomSet() + { + // Create a minimal project for property evaluation testing only + var project = NewElement("Project").WithAttribute("Sdk", "Microsoft.NET.Sdk"); + + // Add PropertyGroup with test properties - NO CodesignEntitlements set + var propertyGroup = NewElement("PropertyGroup"); + propertyGroup.Add(NewElement("TargetFramework").WithValue(GetTfm())); + propertyGroup.Add(NewElement("SingleProject").WithValue("true")); + propertyGroup.Add(NewElement("iOSProjectFolder").WithValue("Platforms\\iOS\\")); + propertyGroup.Add(NewElement("MacCatalystProjectFolder").WithValue("Platforms\\MacCatalyst\\")); + // Simulate the iOS platform for testing purposes + propertyGroup.Add(NewElement("_TestiOSCondition").WithValue("true")); + project.Add(propertyGroup); + + // Add import for the SingleProject Before targets we're testing + var targetsPath = AssemblyInfoTests.GetFilePathFromRoot(IOPath.Combine("src", "Controls", "src", "Build.Tasks", "nuget", "buildTransitive", "netstandard2.0", "Microsoft.Maui.Controls.SingleProject.Before.targets")); + var import = NewElement("Import") + .WithAttribute("Project", targetsPath); + project.Add(import); + + // Create the default entitlements file + project.Add(AddFile("Platforms\\iOS\\Entitlements.plist", "None", "\n")); + + // Add a PropertyGroup that simulates the iOS condition for testing + var testConditionGroup = NewElement("PropertyGroup").WithAttribute("Condition", " '$(SingleProject)' == 'true' and '$(TFMTestiOSCondition)' == 'true' "); + testConditionGroup.Add(NewElement("CodesignEntitlements") + .WithAttribute("Condition", " '$(CodesignEntitlements)' == '' and Exists('$(iOSProjectFolder)Entitlements.plist') ") + .WithValue("$(iOSProjectFolder)Entitlements.plist")); + project.Add(testConditionGroup); + + // Add a target to output the CodesignEntitlements property value for verification + var target = NewElement("Target").WithAttribute("Name", "TestCodesignEntitlements"); + target.Add(NewElement("Message") + .WithAttribute("Text", "CodesignEntitlements = $(CodesignEntitlements)") + .WithAttribute("Importance", "high")); + project.Add(target); + + var projectFile = IOPath.Combine(tempDirectory, "test.csproj"); + project.Save(projectFile); + + // Build the test target to see property evaluation - enable the test condition + var log = Build(projectFile, target: "TestCodesignEntitlements", verbosity: "normal", additionalArgs: "-p:TFMTestiOSCondition=true"); + + // Verify the default CodesignEntitlements property is used + Assert.IsTrue(log.Contains("CodesignEntitlements = Platforms/iOS/Entitlements.plist", StringComparison.Ordinal) || + log.Contains("CodesignEntitlements = Platforms\\iOS\\Entitlements.plist", StringComparison.Ordinal), + "Default Entitlements.plist should be used when no custom CodesignEntitlements is set"); + } } } From 18b6bab4927ba5e833bf8d55b89e0242a30c98a3 Mon Sep 17 00:00:00 2001 From: MartyIX <203266+MartyIX@users.noreply.github.com> Date: Tue, 5 Aug 2025 00:12:23 +0200 Subject: [PATCH 02/28] WIP (#27052) --- .../Extensions/AccessibilityExtensions.cs | 37 +++---------- src/Core/src/Handlers/IElementHandler.cs | 52 +++++++++---------- 2 files changed, 34 insertions(+), 55 deletions(-) diff --git a/src/Controls/src/Core/Platform/Windows/Extensions/AccessibilityExtensions.cs b/src/Controls/src/Core/Platform/Windows/Extensions/AccessibilityExtensions.cs index b32154f1a34e..c0f8de3bd6a8 100644 --- a/src/Controls/src/Core/Platform/Windows/Extensions/AccessibilityExtensions.cs +++ b/src/Controls/src/Core/Platform/Windows/Extensions/AccessibilityExtensions.cs @@ -25,10 +25,7 @@ public static void SetAutomationPropertiesAutomationId(this FrameworkElement Con _defaultAutomationPropertiesName = currentValue = (string)Control.GetValue(NativeAutomationProperties.NameProperty); } -#pragma warning disable CS0618 // Type or member is obsolete - var elemValue = (string)Element.GetValue(AutomationProperties.NameProperty); -#pragma warning restore CS0618 // Type or member is obsolete - + var elemValue = (string)Element.GetValue(SemanticProperties.DescriptionProperty); string newValue = !string.IsNullOrWhiteSpace(elemValue) ? elemValue : _defaultAutomationPropertiesName; if (currentValue is null || currentValue != newValue) @@ -88,10 +85,7 @@ public static void SetAutomationPropertiesAutomationId(this FrameworkElement Con _defaultAutomationPropertiesHelpText = currentValue = (string)Control.GetValue(NativeAutomationProperties.HelpTextProperty); } -#pragma warning disable CS0618 // Type or member is obsolete - var elemValue = (string)Element.GetValue(AutomationProperties.HelpTextProperty); -#pragma warning restore CS0618 // Type or member is obsolete - + var elemValue = (string)Element.GetValue(SemanticProperties.HintProperty); string newValue = !string.IsNullOrWhiteSpace(elemValue) ? elemValue : _defaultAutomationPropertiesHelpText; if (currentValue is null || newValue != currentValue) @@ -123,9 +117,8 @@ public static void SetAutomationPropertiesAutomationId(this FrameworkElement Con { _defaultAutomationPropertiesLabeledBy = currentValue = (UIElement)Control.GetValue(NativeAutomationProperties.LabeledByProperty); } -#pragma warning disable CS0618 // Type or member is obsolete - var elemValue = (VisualElement)Element.GetValue(AutomationProperties.LabeledByProperty); -#pragma warning restore CS0618 // Type or member is obsolete + + var elemValue = (VisualElement)Element.GetValue(SemanticProperties.DescriptionProperty); FrameworkElement? nativeElement = null; if (mauiContext != null) @@ -137,9 +130,7 @@ public static void SetAutomationPropertiesAutomationId(this FrameworkElement Con if (currentValue is null || newValue != currentValue) { -#pragma warning disable CS0618 // Type or member is obsolete - Control.SetValue(AutomationProperties.LabeledByProperty, newValue); -#pragma warning restore CS0618 // Type or member is obsolete + Control.SetValue(SemanticProperties.DescriptionProperty, newValue); } return _defaultAutomationPropertiesLabeledBy; @@ -161,22 +152,10 @@ public static void SetBackButtonTitle(this PageControl Control, Element? Element static string ConcatenateNameAndHint(Element Element) { - string separator; - -#pragma warning disable CS0618 // Type or member is obsolete - var name = (string)Element.GetValue(AutomationProperties.NameProperty); - - var hint = (string)Element.GetValue(AutomationProperties.HelpTextProperty); -#pragma warning restore CS0618 // Type or member is obsolete + var name = (string)Element.GetValue(SemanticProperties.DescriptionProperty); + var hint = (string)Element.GetValue(SemanticProperties.HintProperty); - if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(hint)) - { - separator = ""; - } - else - { - separator = ". "; - } + string separator = string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(hint) ? "" : ". "; return string.Join(separator, name, hint); diff --git a/src/Core/src/Handlers/IElementHandler.cs b/src/Core/src/Handlers/IElementHandler.cs index 64a9e7e46205..228253f8486e 100644 --- a/src/Core/src/Handlers/IElementHandler.cs +++ b/src/Core/src/Handlers/IElementHandler.cs @@ -6,49 +6,49 @@ /// public interface IElementHandler { - /// + /// /// Sets the .NET MAUI context for the element handler. - /// - /// The .NET MAUI context to set. + /// + /// The .NET MAUI context to set. void SetMauiContext(IMauiContext mauiContext); - /// + /// /// Sets the cross-platform virtual view associated with the handler. - /// - /// The element to handle. + /// + /// The element to handle. void SetVirtualView(IElement view); - /// - /// Updates the value of the specified property on the handler. - /// - /// The name of the property to update. + /// + /// Updates the value of the specified property on the handler. + /// + /// The name of the property to update. void UpdateValue(string property); - /// - /// Invokes the specified command on the element with the given arguments. - /// - /// The name of the command to invoke. - /// Optional arguments to pass to the command. + /// + /// Invokes the specified command on the element with the given arguments. + /// + /// The name of the command to invoke. + /// Optional arguments to pass to the command. void Invoke(string command, object? args = null); - /// + /// /// Disconnects the element handler from the element for clean up. - /// + /// void DisconnectHandler(); - /// - /// Gets the platform-specific view object associated with the handler. - /// + /// + /// Gets the platform-specific view object associated with the handler. + /// object? PlatformView { get; } - /// - /// Gets the cross-platform virtual view associated with the handler. - /// + /// + /// Gets the cross-platform virtual view associated with the handler. + /// IElement? VirtualView { get; } - /// - /// Gets the .NET MAUI context associated with the element. - /// + /// + /// Gets the .NET MAUI context associated with the element. + /// IMauiContext? MauiContext { get; } } } \ No newline at end of file From 579d8c3746be1aa10ebc389368331ae0375a7156 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Thu, 7 Aug 2025 13:22:41 -0500 Subject: [PATCH 03/28] [android] improve performance of `ImageHandler.PlatformArrange()` (#23665) Context: https://github.com/davidortinau/AllTheLists Profiling @davidortinau's app, I noticed the "Check-ins" sample felt the slowest on Android. One thing I noticed while scrolling: 98.75ms (0.90%) Microsoft.Maui!Microsoft.Maui.Handlers.ImageHandler.PlatformArrange(Microsoft.Maui.Graphics.Rect) 67.11ms (0.61%) Mono.Android!Android.Widget.ImageView.ScaleType.get_CenterCrop() In this case, `PlatformArrange()` is called a lot for every ``: if (PlatformView.GetScaleType() == ImageView.ScaleType.CenterCrop) { var (left, top, right, bottom) = PlatformView.Context!.ToPixels(frame); var clipRect = new Android.Graphics.Rect(0, 0, right - left, bottom - top); PlatformView.ClipBounds = clipRect; } `ImageView.ScaleType` is a class, and so and some bookkeeping is done to lookup *the same* C# instance for a Java object. We can make this a bit better by writing a new Java method: public static boolean isImageViewCenterCrop(@NonNull ImageView imageView) { return imageView.getScaleType() == ImageView.ScaleType.CENTER_CROP; } Next, let's make a `PlatformView.ToPixels()` extension method that can avoid calling `View.Context` for the same reason. Lastly, we can make a `PlatformInterop.SetClipBounds()` method to avoid creating a `Android.Graphics.Rect` object in C#. With these changes, I can only see the topmost `PlatformArrange()` method now: 2.93ms (0.03%) Microsoft.Maui!Microsoft.Maui.Handlers.ImageHandler.PlatformArrange(Microsoft.Maui.Graphics.Rect) This should improve the layout performance of all .NET MAUI `` on Android. I also "banned" `GetScaleType()` in `eng/BannedSymbols.txt`. --- eng/BannedSymbols.txt | 1 + .../Android/FastRenderers/ImageElementManager.cs | 2 +- .../tests/DeviceTests/Controls.DeviceTests.csproj | 1 + .../java/com/microsoft/maui/PlatformInterop.java | 15 +++++++++++++++ .../src/Handlers/Image/ImageHandler.Android.cs | 7 +++---- .../src/Platform/Android/ContextExtensions.cs | 11 +++++++++++ .../tests/DeviceTests/Core.DeviceTests.csproj | 1 + 7 files changed, 33 insertions(+), 5 deletions(-) diff --git a/eng/BannedSymbols.txt b/eng/BannedSymbols.txt index 9adcf5a06bf3..12123bcfc629 100644 --- a/eng/BannedSymbols.txt +++ b/eng/BannedSymbols.txt @@ -1,5 +1,6 @@ M:Microsoft.Extensions.DependencyInjection.Extensions.ServiceCollectionDescriptorExtensions.TryAddSingleton`2(Microsoft.Extensions.DependencyInjection.IServiceCollection);Use a Factory method to create the service instead M:Android.Content.Res.ColorStateList.#ctor(System.Int32[][],System.Int32[]);Use Microsoft.Maui.PlatformInterop.Get*ColorStateList() Java methods instead +M:Android.Widget.ImageView.GetScaleType();Use PlatformInterop.IsImageViewCenterCrop instead (or add a new method) P:Microsoft.Maui.MauiWinUIApplication.Services;Use the IPlatformApplication.Current.Services instead P:Microsoft.Maui.MauiWinUIApplication.Application;Use the IPlatformApplication.Current.Application instead P:Microsoft.UI.Xaml.Window.AppWindow;This API doesn't have null safety. Use GetAppWindow() and make sure to account for the possibility that GetAppWindow() might be null. diff --git a/src/Compatibility/Core/src/Android/FastRenderers/ImageElementManager.cs b/src/Compatibility/Core/src/Android/FastRenderers/ImageElementManager.cs index 15ae12b64739..9d4e7e5fc9c0 100644 --- a/src/Compatibility/Core/src/Android/FastRenderers/ImageElementManager.cs +++ b/src/Compatibility/Core/src/Android/FastRenderers/ImageElementManager.cs @@ -26,7 +26,7 @@ static void OnLayoutChange(object sender, global::Android.Views.View.LayoutChang { if (sender is IVisualElementRenderer renderer && renderer.View is ImageView imageView) #pragma warning disable CS0618 // Obsolete - AViewCompat.SetClipBounds(imageView, imageView.GetScaleType() == AScaleType.CenterCrop ? new ARect(0, 0, e.Right - e.Left, e.Bottom - e.Top) : null); + AViewCompat.SetClipBounds(imageView, PlatformInterop.IsImageViewCenterCrop(imageView) ? new ARect(0, 0, e.Right - e.Left, e.Bottom - e.Top) : null); #pragma warning restore CS0618 // Obsolete } diff --git a/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj b/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj index 729086c4deaf..5456480ffe41 100644 --- a/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj +++ b/src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj @@ -7,6 +7,7 @@ Microsoft.Maui.DeviceTests Microsoft.Maui.Controls.DeviceTests $(NoWarn),CA1416 + true maccatalyst-x64 maccatalyst-arm64 diff --git a/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformInterop.java b/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformInterop.java index dc6934f574ff..10f724424e45 100644 --- a/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformInterop.java +++ b/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/PlatformInterop.java @@ -689,4 +689,19 @@ public static Animatable getAnimatable(Drawable drawable) { } return null; } + + /* + * Checks if the ScaleType of the ImageView is CENTER_CROP. + * Avoids returning an object to C#. + */ + public static boolean isImageViewCenterCrop(@NonNull ImageView imageView) { + return imageView.getScaleType() == ImageView.ScaleType.CENTER_CROP; + } + + /* + * Sets View.ClipBounds without creating a Rect object in C# + */ + public static void setClipBounds(@NonNull View view, int left, int top, int right, int bottom) { + view.setClipBounds(new Rect(left, top, right, bottom)); + } } diff --git a/src/Core/src/Handlers/Image/ImageHandler.Android.cs b/src/Core/src/Handlers/Image/ImageHandler.Android.cs index bb741ae1a1f8..81e764423ad2 100644 --- a/src/Core/src/Handlers/Image/ImageHandler.Android.cs +++ b/src/Core/src/Handlers/Image/ImageHandler.Android.cs @@ -76,14 +76,13 @@ await handler public override void PlatformArrange(Graphics.Rect frame) { - if (PlatformView.GetScaleType() == ImageView.ScaleType.CenterCrop) + if (PlatformInterop.IsImageViewCenterCrop(PlatformView)) { // If the image is center cropped (AspectFill), then the size of the image likely exceeds // the view size in some dimension. So we need to clip to the view's bounds. - var (left, top, right, bottom) = PlatformView.Context!.ToPixels(frame); - var clipRect = new Android.Graphics.Rect(0, 0, right - left, bottom - top); - PlatformView.ClipBounds = clipRect; + var (left, top, right, bottom) = PlatformView.ToPixels(frame); + PlatformInterop.SetClipBounds(PlatformView, 0, 0, right - left, bottom - top); } else { diff --git a/src/Core/src/Platform/Android/ContextExtensions.cs b/src/Core/src/Platform/Android/ContextExtensions.cs index fbb877a6e8c1..a175c270619e 100644 --- a/src/Core/src/Platform/Android/ContextExtensions.cs +++ b/src/Core/src/Platform/Android/ContextExtensions.cs @@ -122,6 +122,17 @@ static float ToPixelsUsingMetrics(double dp) return (float)Math.Ceiling((dp * s_displayDensity) - GeometryUtil.Epsilon); } + internal static (int left, int top, int right, int bottom) ToPixels(this View view, Graphics.Rect rectangle) + { + return + ( + (int)view.ToPixels(rectangle.Left), + (int)view.ToPixels(rectangle.Top), + (int)view.ToPixels(rectangle.Right), + (int)view.ToPixels(rectangle.Bottom) + ); + } + public static (int left, int top, int right, int bottom) ToPixels(this Context context, Graphics.Rect rectangle) { return diff --git a/src/Core/tests/DeviceTests/Core.DeviceTests.csproj b/src/Core/tests/DeviceTests/Core.DeviceTests.csproj index 7a64c076fdf7..dc7f9a9915f3 100644 --- a/src/Core/tests/DeviceTests/Core.DeviceTests.csproj +++ b/src/Core/tests/DeviceTests/Core.DeviceTests.csproj @@ -7,6 +7,7 @@ Microsoft.Maui.DeviceTests Microsoft.Maui.Core.DeviceTests $(NoWarn),CA1416 + true maccatalyst-x64 maccatalyst-arm64 From 6ef0c416fffd7531d1db4e685eafbb1714bc6b5f Mon Sep 17 00:00:00 2001 From: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com> Date: Thu, 7 Aug 2025 22:58:44 +0200 Subject: [PATCH 04/28] Removed the default span styling from the template (#28818) --- .../Controls.Sample.Embedding/Resources/Styles/Styles.xaml | 4 ---- .../src/templates/maui-mobile/Resources/Styles/Styles.xaml | 4 ---- .../maui-multiproject/MauiApp.1/Resources/Styles/Styles.xaml | 4 ---- 3 files changed, 12 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml b/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml index f5a50bde66c5..a49bfd73cfa0 100644 --- a/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml +++ b/src/Controls/samples/Controls.Sample.Embedding/Resources/Styles/Styles.xaml @@ -173,10 +173,6 @@ - - - - - -