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);