我在选取框列表中使用水平列表视图。哪个是从右到左继续前进。
我的代码是:
double height = canMain.ActualHeight - marqueeList.ActualHeight;
marqueeList.Margin = new Thickness(0, 0, 0, 0);
doubleAnimation.From = -marqueeList.ActualWidth;
doubleAnimation.To = canMain.ActualWidth;
doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(_marqueeTimeInSeconds));
Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Right)"));
_storyBoard.Children.Add(doubleAnimation);
_storyBoard.Begin(marqueeList, true)
但是一旦它完全移动,就会有空白空间,直到第一个项目不再来。 我想删除第一个项目到最后一个项目之间的空白区域。(像圆形一样)
答案 0 :(得分:2)
如果您的ListView项目不需要鼠标或键盘交互,您可以在其右侧放置一个带有可视刷的Rectangle:
<DockPanel Name="marqueeListTwice">
<ListView Name="marqueeList" .../>
<Rectangle Height="{Binding RenderHeight,ElementName=marqueeList}"
Width="{Binding RenderWidth,ElementName=marqueeList}">
<Rectangle.Fill>
<VisualBrush Visual="{Binding ElementName=marqueeList}" />
</Rectangle.Fill>
</Rectangle>
</DockPanel>
这个DockPanel现在看起来有两个并排的ListView副本:左边的那个是真实的,而右边的那个是绘有图片的矩形。 VisualBrush绘画机制是“完美的”,因为你无法从真实的东西中分辨出彩绘的副本。
现在,您可以在画布上设置“marqueeListTwice”控件的动画,距离为marqueeList.ActualWidth。当你走到尽头时,你会看到第一个项目,但实际上你会看到它在矩形上绘制的图像。当你回到0时,“真正的”第一项将再次可见,但由于它在视觉上是相同的,所以你不会得到闪烁。
如果您需要单独的项目在平移期间与鼠标交互,此解决方案将无法工作,因为绘制的矩形将不会按预期响应:您需要逻辑来滑动单个项目而不是滑动包含ListView他们都是。您仍然可以使用动画来执行此操作:只需为容器Window或UserControl的属性设置动画,然后使用它来计算项目位置。