处理ManipulationDelta事件会破坏父ScrollViewer

时间:2015-11-22 12:24:07

标签: uwp scrollviewer windows-10-mobile flipview

我想实现这样的动画:

Demo

所以我决定使用 FlipView 作为主要容器,将网格用两行作为数据模板。 Grid将处理 ManipulationDelta 事件以降低文本第一部分的高度,以便第二部分变得可见。当文本高度达到最小值时,我们必须将事件路由到父ScrollViewer,以便它可以翻转到下一个项目。

private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        if (CanDecreaseLine(e))
        {
            //Decrease first line height...
            e.Handled = true;
        }
    }

但我遇到的问题是,当我尝试在子(Grid)端处理ManipulationDelta时,FlipView停止工作。无论我们是否设置了Handled属性

这是简化的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的子节点上的操作事件,还是有其他方法来实现这个动画?

1 个答案:

答案 0 :(得分:2)

当FlipView更改ManipulationDelta时,您可以尝试订阅SelectedItem事件。然后根据需要在Grid内部处理它。然后,当您检测到用户进一步滚动并且您应该停止处理Grid中的事件时,取消订阅该事件并让FlipView正常处理它。

Haven未对此进行测试,因此不确定它是否能正常工作。

此外,您可能需要通过可视树进行挖掘,以获取正确的Grid以参与该事件。或者在UserControl中使用DataTemplate,其中包含可以为ManipulationDelta事件切换订阅的属性(可以绑定)。