ItemsControl
or内のアイテムを移動するときScrollViewer
、コンテンツをループして、最初のアイテムが最後のアイテムの「後」に来るようにすることはできますか?
現在ScrollViewer
、ItemControl
. コントロールを設定するための XAML は次のとおりです。
<local:AnimatedScrollControl x:Name="myScroll" Grid.Column="1" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden">
<ItemsControl x:Name="myList"
ItemsSource="{Binding SlidesList}"
ItemTemplate="{StaticResource SlideTemplateOne}"
VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</local:AnimatedScrollControl>
内の各項目はItemControl
、コントロールの表示領域全体を占有するため、ユーザーには一度に 1 つの項目しか表示されません。以下の画像は、動作中のコントロールを表しており、赤いボックスはビューポートを示しています。タイマーが自動的に次のアイテムに移動します。
スライドをシフトするコード (簡潔にするために単純化されています) は現在、次のようになっています。
private void NextSlide()
{
_currentSlide++;
// get the current offset
double offset = (double)myScroll.GetValue(AnimatedScrollControl.SlideOffsetProperty);
// get the width of the current slide
FrameworkElement elementContainer = myList.ItemContainerGenerator.ContainerFromItem(CurrentSlide) as FrameworkElement;
// set the `to` value for a single slide shift
double to = offset + elementContainer.ActualWidth;
if (_currentSlide == _items.Count)
{
to = 0;
_currentSlide = 0;
}
DoubleAnimation animation = new DoubleAnimation();
animation.EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut };
animation.From = offset;
animation.To = to;
animation.Duration = TimeSpan.FromMilliseconds(300);
myScroll.BeginAnimation(AnimatedScrollControl.SlideOffsetProperty, animation);
}
最後のスライドに到達し、ビューポートが最初のスライドに更新されると、すべてのスライドを逆方向にスキャンして最初に到達します。そのように: 私がしたいのは、ビューポートが「スライド 5」から「スライド 1」に直接スキャンするかのように見せることです。
これを達成するために、またはを設定しItemsControl
たりScrollViewer
、調整したりする方法はありますか?Animation