如何在点击列表项时触发故事板并在动画结束时通知页面?

时间:2013-04-29 18:33:00

标签: windows-8 windows-runtime microsoft-metro windows-store-apps

我将Windows Phone 8应用程序移植到Windows 8,我有一个场景,用户点击我的列表控件/网格视图中的项目,我想要播放"激活"项目上的动画,等待动画完成,然后离开页面。

在Windows Phone上,我在一种情况下使用了DataTriggers,在另一种情况下,我使用VisualTreeHelper迭代视图并找到VirtualizingStackPanel,然后查找实际项目,然后直接访问它以调用故事板......

在这种情况下似乎都不起作用,似乎winrt(DataTrigger in WinRT?)也不支持DataTriggers。

我想在这里做正确的事。我已经看到了可以使用视觉状态的建议,但在这种情况下还不清楚。

任何帮助都非常感激。

由于

1 个答案:

答案 0 :(得分:1)

我有两种方法可以解决这个问题,但两种方式都不是特别漂亮。

方法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集合中获取动画,将完成处理程序附加到它,然后运行它。您可以在完成处理程序中执行导航。