fix(reg): Workaround Gallery measure issue on Android
This commit is contained in:
Родитель
a0955f2b99
Коммит
6c1e90e187
|
@ -938,7 +938,11 @@ namespace Uno.UI.RuntimeTests.Tests.Windows_UI_Xaml
|
|||
|
||||
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);
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ using System.Threading.Tasks;
|
|||
using Android.Views.Animations;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using Uno.UI.Controls;
|
||||
using Microsoft.UI.Xaml.Media;
|
||||
|
||||
namespace Uno.UI
|
||||
{
|
||||
|
@ -705,6 +706,10 @@ namespace Uno.UI
|
|||
{
|
||||
root = parent;
|
||||
}
|
||||
else if (root is DependencyObject @do && VisualTreeHelper.GetParent(@do) is ViewGroup managedParent)
|
||||
{
|
||||
root = managedParent;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
|
|
|
@ -74,6 +74,7 @@ internal static class LayouterElementExtensions
|
|||
if (isDirty || frameworkElement is null)
|
||||
{
|
||||
// We must reset the flag **BEFORE** doing the actual measure, so the elements are able to re-invalidate themselves
|
||||
// TODO: We are not controlling measure dirty path on Android. If we did in future, we must clear it here as well.
|
||||
frameworkElement?.ClearLayoutFlags(UIElement.LayoutFlag.MeasureDirty);
|
||||
|
||||
// The dirty flag is explicitly set on this element
|
||||
|
@ -91,7 +92,9 @@ internal static class LayouterElementExtensions
|
|||
LayoutInformation.SetAvailableSize(element, availableSize);
|
||||
}
|
||||
|
||||
return true; // end of isDirty processing
|
||||
// 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:
|
||||
|
@ -110,6 +113,8 @@ internal static class LayouterElementExtensions
|
|||
{
|
||||
var previousDesiredSize = childAsUIElement.m_desiredSize;
|
||||
childAsUIElement.EnsureLayoutStorage();
|
||||
|
||||
// TODO: This is NOT correct. This should call DoMeasure (the same method we are in currently!)
|
||||
element.Layouter.MeasureChild(child, childAsUIElement.m_previousAvailableSize);
|
||||
var newDesiredSize = childAsUIElement.m_desiredSize;
|
||||
if (newDesiredSize != previousDesiredSize)
|
||||
|
|
|
@ -393,6 +393,31 @@ namespace Microsoft.UI.Xaml.Media
|
|||
{
|
||||
#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__
|
||||
|
|
|
@ -1149,6 +1149,9 @@ namespace Microsoft.UI.Xaml
|
|||
// 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
|
||||
(VisualTreeHelper.GetParent(this) as UIElement)?.InvalidateMeasure();
|
||||
#elif __IOS__
|
||||
SetNeedsLayout();
|
||||
SetLayoutFlags(LayoutFlag.MeasureDirty);
|
||||
|
|
Загрузка…
Ссылка в новой задаче