Skip to content

A bug with Grid and InvalidateArrange call (which probably cause problems in TransitioningContentControl) #13509

Description

@deryaza

If you take ReactiveUIDemo and apply this patch
0002-bug.patch

This fill fail with the following exception:

Details
System.NullReferenceException: Object reference not set to an instance of an object.
   at Avalonia.Controls.Grid.ArrangeOverride(Size arrangeSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Grid.cs:line 526
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Controls.Presenters.ContentPresenter.ArrangeOverrideImpl(Size finalSize, Vector offset) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 660
   at Avalonia.Controls.Presenters.ContentPresenter.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 589
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Layout.Layoutable.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 721
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Controls.Presenters.ContentPresenter.ArrangeOverrideImpl(Size finalSize, Vector offset) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 660
   at Avalonia.Controls.Presenters.ContentPresenter.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 589
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Layout.Layoutable.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 721
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Layout.Layoutable.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 721
   at Avalonia.Controls.TransitioningContentControl.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\TransitioningContentControl.cs:line 59
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Controls.StackPanel.ArrangeChild(Control child, Rect rect, Size panelSize, Orientation orientation) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\StackPanel.cs:line 355
   at Avalonia.Controls.StackPanel.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\StackPanel.cs:line 341
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Controls.Presenters.ContentPresenter.ArrangeOverrideImpl(Size finalSize, Vector offset) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 660
   at Avalonia.Controls.Presenters.ScrollContentPresenter.ArrangeWithAnchoring(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Presenters\ScrollContentPresenter.cs:line 472
   at Avalonia.Controls.Presenters.ScrollContentPresenter.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Presenters\ScrollContentPresenter.cs:line 401
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Controls.Grid.ArrangeOverride(Size arrangeSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Grid.cs:line 549
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Layout.Layoutable.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 721
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Controls.Presenters.ContentPresenter.ArrangeOverrideImpl(Size finalSize, Vector offset) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 660
   at Avalonia.Controls.Presenters.ContentPresenter.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 589
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Layout.LayoutHelper.ArrangeChildInternal(Layoutable child, Size availableSize, Thickness padding) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutHelper.cs:line 91
   at Avalonia.Layout.LayoutHelper.ArrangeChild(Layoutable child, Size availableSize, Thickness padding) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutHelper.cs:line 86
   at Avalonia.Controls.Decorator.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Decorator.cs:line 60
   at Avalonia.Controls.Primitives.VisualLayerManager.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\Primitives\VisualLayerManager.cs:line 161
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Layout.Layoutable.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 721
   at Avalonia.Layout.Layoutable.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 669
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Layout.Layoutable.ArrangeOverride(Size finalSize) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 721
   at Avalonia.Controls.WindowBase.ArrangeCore(Rect finalRect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Controls\WindowBase.cs:line 296
   at Avalonia.Layout.Layoutable.Arrange(Rect rect) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 418
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 334
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 322
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 322
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 322
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 322
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 322
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 322
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 322
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 322
   at Avalonia.Layout.LayoutManager.Arrange(Layoutable control) in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 322
   at Avalonia.Layout.LayoutManager.ExecuteArrangePass() in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 272
   at Avalonia.Layout.LayoutManager.InnerLayoutPass() in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 240
   at Avalonia.Layout.LayoutManager.ExecuteLayoutPass() in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 151
   at Avalonia.Layout.LayoutManager.ExecuteQueuedLayoutPass() in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 111
   at Avalonia.Media.MediaContext.FireInvokeOnRenderCallbacks() in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Media\MediaContext.cs:line 198
   at Avalonia.Media.MediaContext.RenderCore() in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Media\MediaContext.cs:line 135
   at Avalonia.Media.MediaContext.Render() in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Media\MediaContext.cs:line 116
   at Avalonia.Threading.DispatcherOperation.InvokeCore() in C:\Users\デリャザ\source\repos\Avalonia\src\Avalonia.Base\Threading\DispatcherOperation.cs:line 274

Basically, exception happens like this:

  1. MeasureOverride happens. Since extData is null, it doesn't call ValidateDefinitionsUStructure that creates DefinitionsU.
  2. OnLoaded event happens where access to RowDefinitions creates _extData
  3. ArrangeOverride happens and now it falls into different branch of if (_extData is null) where it expects to have Debug.Assert(DefinitionsU.Count > 0 && DefinitionsV.Count > 0); initialized from MeasureOverride call.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions