From 76c3d0c03d9b2457cc312db577258f3c9a93013d Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 2 May 2019 16:16:29 +0200 Subject: [PATCH] Handle item insertion in CarouselPresenter. Fixes #2432. --- .../Presenters/CarouselPresenter.cs | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs index ba2c7c91d8..f9f8d58430 100644 --- a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs +++ b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs @@ -38,7 +38,6 @@ namespace Avalonia.Controls.Presenters Carousel.PageTransitionProperty.AddOwner(); private int _selectedIndex = -1; - // private Task _current; private Task _currentTransition; private int _queuedTransitionIndex = -1; @@ -105,12 +104,33 @@ namespace Avalonia.Controls.Presenters /// protected override void ItemsChanged(NotifyCollectionChangedEventArgs e) { + var generator = ItemContainerGenerator; + switch (e.Action) { + case NotifyCollectionChangedAction.Add: + var end = e.NewStartingIndex + e.NewItems.Count; + + if (end < Items.Count()) + { + generator.InsertSpace(e.NewStartingIndex, e.NewItems.Count); + } + + if (SelectedIndex >= e.NewStartingIndex && SelectedIndex < end) + { + var newItem = GetOrCreateContainer(SelectedIndex); + + foreach (var control in Panel.Children) + { + control.IsVisible = control == newItem; + } + } + + break; + case NotifyCollectionChangedAction.Remove: if (!IsVirtualized) { - var generator = ItemContainerGenerator; var containers = generator.RemoveRange(e.OldStartingIndex, e.OldItems.Count); Panel.Children.RemoveAll(containers.Select(x => x.ContainerControl)); @@ -122,7 +142,6 @@ namespace Avalonia.Controls.Presenters case NotifyCollectionChangedAction.Reset: { - var generator = ItemContainerGenerator; var containers = generator.Containers.ToList(); generator.Clear(); Panel.Children.RemoveAll(containers.Select(x => x.ContainerControl));