在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
占据了控件的整个可见区域,因此用户一次只能看到一个项目。下图表示正在运行的控件,红色框表示视口。计时器自动移动到下一个项目。
移动幻灯片的代码(为简洁起见)当前如下所示:
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
orScrollViewer
或调整 myAnimation
以实现此目的?