WPF列表框项的动画效果

5

你知道我应该采取什么方法来使数据绑定的列表框中的项目“飞”到它们在列表框中的位置,就像在Windows纸牌游戏中发牌时看到的效果一样吗?(我正在使用WPF)

1个回答

3
您需要扩展Panel类,并将其用作ListBox.ItemsPanel属性的ItemsPanelTemplate。这很容易...只需重写两个方法:一个是测量ListBox中的项,另一个是排列它们。这里是微软关于此主题的文章
这里可能有一个更有用的文章(不幸的是,已不再可用),其中显示了如何对项目进行动画处理。对于您的效果,您只需将位置动画的起始值设置为每个项目刚好超出可视区域的相同位置。例如,使用0,finalSize.Height作为起始位置意味着每个项目都会从ListBox的左下角滑动到其位置。您可以按以下方式使用新的动画Panel
<ListBox>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <YourXmlNamespace:YourAnimatedPanel AnyCustomProperty="value" />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

谢谢您,Sheridan!我直接使用了“更有用的文章”链接,它提供了我想要的效果。 - Shawn de Wet
这里提醒其他用户注意一点...我发现当列表框包含几百个项目并且我调整屏幕大小(通过拖动窗口边框)时,动画会变得非常缓慢。然而,加载列表框时动画仍然很好(这就是我想要的)-只有调整屏幕大小才会导致我的GUI卡顿!但由于我的情况不涉及用户不断调整屏幕大小,所以我不会担心这个问题。 - Shawn de Wet
你可以将动画应用于新添加的项,这样当用户调整Window大小时,这些项就会“跳”到它们的新位置...虽然看起来不太好,但更新时不会出现卡顿。如果你确实想要这样做,只需在自定义Panel中添加一个类型为UIElement的私有列表。在ArrangeOverride方法的末尾,清除你的列表,然后将Panel.Children属性中的每个子元素添加到其中。下次调用该方法时,此List将包含先前在Panel中的子元素。然后对不包含在List中的项进行动画处理。 - Sheridan
更有用的文章链接已经失效。 - Guge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接