我想实现这样的动画:
所以我决定使用 FlipView 作为主要容器,将网格用两行作为数据模板。 Grid将处理 ManipulationDelta 事件以降低文本第一部分的高度,以便第二部分变得可见。当文本高度达到最小值时,我们必须将事件路由到父ScrollViewer,以便它可以翻转到下一个项目。
private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
if (CanDecreaseLine(e))
{
//Decrease first line height...
e.Handled = true;
}
}
这是简化的xaml:
<FlipView>
<FlipView.ItemTemplate>
<DataTemplate>
<Grid Background="Transparent"
ManipulationMode="TranslateY, TranslateInertia"
ManipulationDelta="OnManipulationDelta">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="FirstLine"/>
<TextBlock Grid.Row="1" Text="SecondLine"/>
</Grid>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
由于 ManipulationMode =&#34; TranslateY,TranslateInertia&#34; ,ScrollViewer停止工作,但没有它Grid不会收到我需要更改Grid行大小的操作事件实现动画。
是否可以处理ScrollViewer的子节点上的操作事件,还是有其他方法来实现这个动画?
答案 0 :(得分:2)
当FlipView更改ManipulationDelta
时,您可以尝试订阅SelectedItem
事件。然后根据需要在Grid
内部处理它。然后,当您检测到用户进一步滚动并且您应该停止处理Grid
中的事件时,取消订阅该事件并让FlipView正常处理它。
Haven未对此进行测试,因此不确定它是否能正常工作。
此外,您可能需要通过可视树进行挖掘,以获取正确的Grid
以参与该事件。或者在UserControl
中使用DataTemplate
,其中包含可以为ManipulationDelta
事件切换订阅的属性(可以绑定)。