Обработка события ManipulationDelta прерывает родительский ScrollViewer

Я хочу реализовать анимацию следующим образом:

Демо

Поэтому я решил использовать FlipView в качестве основного контейнера и сетку с двумя строками в качестве шаблона данных. Grid будет обрабатывать событие ManipulationDelta, чтобы уменьшить высоту первой части текста, чтобы вторая часть стала видимой. Когда высота текста достигает минимального значения, мы должны перенаправить событие в родительский ScrollViewer, чтобы он мог перейти к следующему элементу.

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

Но я столкнулся с проблемой, что когда я пытаюсь обработать ManipulationDelta на дочерней (Grid) стороне, 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 или есть ли другой способ добиться этой анимации?


person Dmitry Ponomarenko    schedule 22.11.2015    source источник


Ответы (1)


Вы можете попробовать подписаться на событие ManipulationDelta, когда FlipView изменяет SelectedItem. Затем обработайте его внутри Grid по мере необходимости. Затем, когда вы обнаружите, что пользователь прокручивает дальше, и вы должны прекратить обработку события в Grid, отмените подписку на событие и позвольте FlipView обрабатывать его как обычно.

Не проверял это, поэтому не уверен, что это сработает.

Кроме того, вам, вероятно, придется немного покопаться в визуальном дереве, чтобы выбрать правильный Grid для перехода к событию. Или используйте UserControl в DataTemplate, у которого есть свойство (которое можно связать), которое может переключать подписку на событие ManipulationDelta.

person Jon G Stødle    schedule 29.11.2015