2011-03-09 85 views
5

任何想法我会按照什么方法让数据绑定列表框的项目“飞”到他们在列表框中的位置,类似于当你在这些Windows中处理一副牌时看到的效果纸牌游戏? (我正在使用WPF)WPF动画列表框项目

回答

3

您需要扩展Panel类,并将其用作ListBox.ItemsPanel属性的ItemsPanelTemplate。这很容易......只有两种方法可以覆盖;一个用于测量ListBox中的项目,另一个用于安排它们。这里是关于这个主题的微软article

这可能是一个more useful article [不幸的是,不再可用],显示如何动画的项目。对于您的效果,您只需将位置动画的起始值设置为与每个项目的可见区域相同的位置即可。例如,使用从0, finalSize.Height的起始位置意味着每个项目将从ListBox的左下角滑动到其位置。 你可以使用你的新动画Panel如下:

<ListBox> 
    <ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <YourXmlNamespace:YourAnimatedPanel AnyCustomProperty="value" /> 
    </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 
+0

谢谢谢里登!我使用了“更有用的文章”链接,它提供了我想到的效果。 – 2011-03-10 02:08:20

+0

只是要记住其他用户谁遇到这个......我已经注意到,虽然当列表框包含几百个项目,我调整屏幕大小(通过拖动窗口边框),但动画获取相当dogslow。虽然加载列表框时动画仍然很好(这正是我想要的) - 这只是屏幕的大小调整,导致我的图形用户界面(stu-stu-stutter)!但由于我的场景不涉及用户不断调整屏幕大小,我不担心这一点。 – 2011-03-10 02:12:25

+0

您可以将动画应用于新添加的项目,因此当用户调整“窗口”大小时,项目将跳转到新的位置......它看起来不太好,但它不应该结结实实更新时。如果你真的想这样做,只需在自定义的Panel中添加一个'UIElement'类型的'Private List'。在'ArrangeOverride'方法的末尾,清除你的'List',然后将'Panel.Children'属性中的每个孩子添加到它中。下一次该方法被调用时,这个'List'将包含之前在'Panel'中的子元素。然后动画不包含在“List”中的项目。 – Sheridan 2011-03-10 21:22:29