diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 2bade8325363..799ce2dcde05 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -224,6 +224,9 @@
$(NoWarn);CS0436
+
+ $(NoWarn);NU1903
+
diff --git a/src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_UIElement.cs b/src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_UIElement.cs
index 60fa526b05ca..fa8acc766dd1 100644
--- a/src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_UIElement.cs
+++ b/src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_UIElement.cs
@@ -938,11 +938,7 @@ public async Task When_InvalidatingMeasureExplicitly()
using var _ = new AssertionScope();
-#if __ANDROID__
- ctl1.MeasureCount.Should().Be(2);
-#else
ctl1.MeasureCount.Should().Be(1);
-#endif
ctl2.MeasureCount.Should().Be(2);
ctl3.MeasureCount.Should().Be(1);
diff --git a/src/Uno.UI/Extensions/ViewExtensions.Android.cs b/src/Uno.UI/Extensions/ViewExtensions.Android.cs
index c6c2124279c3..4ac82ffcda42 100644
--- a/src/Uno.UI/Extensions/ViewExtensions.Android.cs
+++ b/src/Uno.UI/Extensions/ViewExtensions.Android.cs
@@ -21,7 +21,6 @@
using Android.Views.Animations;
using Microsoft.UI.Xaml.Controls;
using Uno.UI.Controls;
-using Microsoft.UI.Xaml.Media;
namespace Uno.UI
{
@@ -706,10 +705,6 @@ public static string ShowLocalVisualTree(this ViewGroup viewGroup, int fromHeigh
{
root = parent;
}
- else if (root is DependencyObject @do && VisualTreeHelper.GetParent(@do) is ViewGroup managedParent)
- {
- root = managedParent;
- }
else
{
break;
diff --git a/src/Uno.UI/UI/Xaml/DependencyObjectStore.cs b/src/Uno.UI/UI/Xaml/DependencyObjectStore.cs
index 1305066e97cb..571f0fcc590e 100644
--- a/src/Uno.UI/UI/Xaml/DependencyObjectStore.cs
+++ b/src/Uno.UI/UI/Xaml/DependencyObjectStore.cs
@@ -1327,7 +1327,18 @@ private void CleanupInheritedProperties()
return (localProperty, propertyDetails);
}
}
- else if (property.IsAttached && property.IsInherited)
+ else if (property.IsAttached
+ && property.IsInherited
+
+#if __ANDROID__
+ // This is a workaround related to property inheritance and
+ // https://github.com/unoplatform/uno/pull/18261.
+ // Removing this line can randomly produce elements not rendering
+ // properly, such as TextBlock not measure/arrange properly
+ // even when invalidated.
+ && _properties.FindPropertyDetails(property) is { }
+#endif
+ )
{
return (property, _properties.GetPropertyDetails(property));
}
diff --git a/src/Uno.UI/UI/Xaml/ILayouterElement.cs b/src/Uno.UI/UI/Xaml/ILayouterElement.cs
index 68f5f0d7d2fa..58c0dc9c4032 100644
--- a/src/Uno.UI/UI/Xaml/ILayouterElement.cs
+++ b/src/Uno.UI/UI/Xaml/ILayouterElement.cs
@@ -95,6 +95,7 @@ internal static bool DoMeasure(this ILayouterElement element, Size availableSize
// TODO: This is NOT correct.
// We shouldn't return here. Skipping children measure is incorrect but fixing it on Android isn't trivial.
return true;
+
}
// The measure dirty flag is set on one of the descendents:
diff --git a/src/Uno.UI/UI/Xaml/Media/VisualTreeHelper.cs b/src/Uno.UI/UI/Xaml/Media/VisualTreeHelper.cs
index 0e74bb600b47..ec4af5e05f56 100644
--- a/src/Uno.UI/UI/Xaml/Media/VisualTreeHelper.cs
+++ b/src/Uno.UI/UI/Xaml/Media/VisualTreeHelper.cs
@@ -393,31 +393,6 @@ internal static void AddChild(UIElement view, UIElement child)
{
#if __ANDROID__
view.AddView(child);
-
- // Reset to original (invalidated) state
- child.ResetLayoutFlags();
- if (view.IsMeasureDirtyPathDisabled)
- {
- FrameworkElementHelper.SetUseMeasurePathDisabled(child); // will invalidate too
- }
- else
- {
- child.InvalidateMeasure();
- }
-
- if (view.IsArrangeDirtyPathDisabled)
- {
- FrameworkElementHelper.SetUseArrangePathDisabled(child); // will invalidate too
- }
- else
- {
- child.InvalidateArrange();
- }
-
- // Force a new measure of this element (the parent of the new child)
- view.InvalidateMeasure();
- view.InvalidateArrange();
-
#elif __IOS__ || __MACOS__
view.AddSubview(child);
#elif __CROSSRUNTIME__
diff --git a/src/Uno.UI/UI/Xaml/UIElement.cs b/src/Uno.UI/UI/Xaml/UIElement.cs
index bd1c88625bae..2753f624f8d1 100644
--- a/src/Uno.UI/UI/Xaml/UIElement.cs
+++ b/src/Uno.UI/UI/Xaml/UIElement.cs
@@ -1155,25 +1155,6 @@ public void InvalidateMeasure()
// Use a non-virtual version of the RequestLayout method, for performance.
base.RequestLayout();
SetLayoutFlags(LayoutFlag.MeasureDirty);
-
- // HACK: Android's implementation of measure/arrange is not accurate. See comments in LayouterElementExtensions.DoMeasure
- global::Android.Views.IViewParent parent = this;
- parent = parent.Parent;
- while (parent is not null)
- {
- if (parent is UIElement parentAsUIElement)
- {
- parentAsUIElement.InvalidateMeasure();
- break;
- }
- else
- {
- parent.RequestLayout();
- }
-
- parent = parent.Parent;
- }
-
#elif __IOS__
SetNeedsLayout();
SetLayoutFlags(LayoutFlag.MeasureDirty);