在浏览ItemsControl
或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
或ScrollViewer
或调整我的Animation
来实现这一目标? 最佳答案
我的解决方案是使用WPF博士编写的旧LoopFrame
类的形式。
http://drwpf.com/blog/2009/08/05/itemscontrol-n-is-for-natural-user-interface/
关于c# - 通过动画循环WPF ItemsControl或ScrollViewer中的项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14343338/