【问题标题】:Handling of ManipulationDelta event breaks parent ScrollViewerManipulationDelta 事件的处理打破了父 ScrollViewer
【发布时间】:2015-11-30 00:35:58
【问题描述】:

我想实现这样的动画:

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

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

但我遇到的问题是,当我尝试在子(网格)端处理 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>

ScrollViewer 由于 ManipulationMode="TranslateY, TranslateInertia" 而停止工作,但如果没有它,Grid 将不会接收我需要更改 Grid 行的大小以实现动画的操作事件。

是否可以在 ScrollViewer 的子级上处理操作事件,或者是否有任何其他方式来实现此动画?

【问题讨论】:

    标签: uwp scrollviewer windows-10-mobile flipview


    【解决方案1】:

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

    还没有测试过,所以不确定它是否会起作用。

    此外,您可能需要对可视化树进行一些挖掘,以获取正确的 Grid 以子事件。或者在DataTemplate 中使用UserControl,它有一个属性(可以绑定到),可以切换ManipulationDelta 事件的订阅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多