diff --git a/src/Perspex.Controls/Presenters/CarouselPresenter.cs b/src/Perspex.Controls/Presenters/CarouselPresenter.cs
index 7af2416b9a..e130936d29 100644
--- a/src/Perspex.Controls/Presenters/CarouselPresenter.cs
+++ b/src/Perspex.Controls/Presenters/CarouselPresenter.cs
@@ -55,6 +55,8 @@ namespace Perspex.Controls.Presenters
private int _selectedIndex = -1;
private bool _createdPanel;
private IItemContainerGenerator _generator;
+ private Task _currentTransition;
+ private int _queuedTransitionIndex = -1;
///
/// Initializes static members of the class.
@@ -187,35 +189,39 @@ namespace Perspex.Controls.Presenters
/// A task tracking the animation.
private async Task MoveToPage(int fromIndex, int toIndex)
{
- var generator = ItemContainerGenerator;
- IControl from = null;
- IControl to = null;
-
- if (fromIndex != -1)
+ if (fromIndex != toIndex)
{
- from = generator.ContainerFromIndex(fromIndex);
- }
+ var generator = ItemContainerGenerator;
+ IControl from = null;
+ IControl to = null;
- if (toIndex != -1)
- {
- var item = Items.Cast
/// The event args.
- private void SelectedIndexChanged(PerspexPropertyChangedEventArgs e)
+ private async void SelectedIndexChanged(PerspexPropertyChangedEventArgs e)
{
if (Panel != null)
{
- var task = MoveToPage((int)e.OldValue, (int)e.NewValue);
+ if (_currentTransition == null)
+ {
+ int fromIndex = (int)e.OldValue;
+ int toIndex = (int)e.NewValue;
+
+ for (;;)
+ {
+ _currentTransition = MoveToPage(fromIndex, toIndex);
+ await _currentTransition;
+
+ if (_queuedTransitionIndex != -1)
+ {
+ fromIndex = toIndex;
+ toIndex = _queuedTransitionIndex;
+ _queuedTransitionIndex = -1;
+ }
+ else
+ {
+ _currentTransition = null;
+ break;
+ }
+ }
+ }
+ else
+ {
+ _queuedTransitionIndex = (int)e.NewValue;
+ }
}
}
}