2010-06-17 55 views
1

我正在使用选框列表水平列表视图。哪些从右向左继续移动。如何从选取框列表的第一个项目和最后一个项目中删除空格?

我的代码是:

 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) 

但是一旦移动完全有空格来,直到再次中的第一项不来。 我想删除第一项之间的空白空间,最后一个项目。(像circullar)

请帮我在这...它的迫切!

回答

2

如果您的ListView项目不需要鼠标或键盘交互你可以把一个矩形视觉刷到它的右:

<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的属性设置动画,然后使用它来计算您的项目位置。

+0

感谢乌拉圭回合的答复!但我需要在我的选取框列表上使用鼠标,所以没有其他方式来实现它? – 2010-06-18 15:17:42

+0

是的。正如我在最后一段中提到的,您可以使用自己的逻辑将项目精确地滑到您想要的位置,而不是使用ListView为您完成。我会用自定义Panel子类来做到这一点。自定义面板将有一个属性“Offset”,它可以从0到1或从0到ItemCount计数。该属性将设置InvalidatesArrange标志。然后在你的ArrangeOverride你会使用偏移值,孩子大小等。该计算的细节取决于您的具体需要计算所有孩子的位置。 – 2010-06-18 19:38:44

+0

要使数据绑定与自定义面板一起工作,您可以继续使用ListView并将其ItemsPanel属性设置为ItemsPanelTemplate,其中包含您的自定义面板类的实例,并根据需要绑定其Offset属性。然后,只需动画到这个偏移是绑定的属性,这将导致Offset属性更新和ArrangeOverride重新计算的位置。 – 2010-06-18 19:41:08

相关问题