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 @@
-
-
-
-
-
-