我有两种方法可以解决这个问题,但都不是特别漂亮。
方法A
创建一个将充当每个 GridView 项的自定义控件,并将其放置在 GridView 的 ItemTemplate 中。
<GridView>
<GridView.ItemTemplate>
<DataTemplate>
<mynamespace:MyControl/>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
然后,在 MyControl 的构造函数中,将处理程序附加到 Tapped 事件,并在该处理程序中执行动画。动画可以在 MyControl.xaml 中定义。MyControl 还应该在动画完成时公开一个事件
public event EventHandler SelectedAnimationComplete;
并在您的自定义故事板完成时触发它。承载 GridView 的页面可以附加到 MyControl 的自定义事件以执行导航。
...
<mynamespace:MyControl SelectedAnimationComplete="selectedAnimationComplete"/>
...
方法B
在 GridView 上,将 SelectionMode 设置为 None,将 IsItemClickEnabled 设置为 true,并将处理程序附加到 ItemClick 事件。在处理程序内部,您可以使用
(sender as GridView).ItemContainerGenerator.ContainerFromItem(e.ClickedItem)
获取 GridViewItem,然后使用 VisualTreeHelper.GetChild 挖掘可视化树。在您的 ItemTemplate 中,根视觉对象(可能是网格)可以将您的动画放置在其资源集合中。向下挖掘可视化树,直到找到 ItemTemplate 的根网格,从其 Resources 集合中获取动画,将完成处理程序附加到它,然后运行它。您可以在完成处理程序中执行导航。