Отключите прокрутку в ScrollViewer, дочернем элементе фрейма, в котором ScrollViewer является родительским - PullRequest
1 голос
/ 23 мая 2019

Государство

У меня есть Page (Page_Child) с ScrollViewer (ScrollViewer_Child) в Frame (Frame_Parent), который является потомком моего родителя ScrollViewer (ScrollViewer_Parent).

<ScrollViewer Name="ScrollViewer_Parent">
    <StackPanel>
        <Frame Name="Frame_Parent">
            <Frame.Content>

                <Page Name="Page_Child">
                    <ScrollViewer Name="ScrollViewer_Child">
                        <!-- Page Content -->
                    </ScrollViewer>
                </Page>

            </Frame.Content>
        </Frame>
        <!-- ... -->
    </StackPanel>
</ScrollViewer>

Задача

Я пытаюсь добиться отключения ScrollViewer в Frame, поскольку родительский элемент ScrollViewer может обрабатывать все захваты благодаря нефиксированной высоте Frame. - Или, по крайней мере, пусть родитель продолжит прокрутку, когда ребенок достигнет вершины или низа.

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

Вопрос

Есть ли способ сообщить содержимому фрейма, чтобы отключить прокрутку, или как архивировать продолжающуюся прокрутку по фрейму?

1 Ответ

1 голос
/ 23 мая 2019

Если вы могли использовать внешние библиотеки, вы могли бы использовать здесь следующее: BubbleScrollEvent Behavior , но, поскольку вы не можете, вы можете просто написать похожую вещь, но в коде позади;

, прикрепив метод к событию PreviewMouseWheel из Frame, который перенаправит событие в ScrollViewer следующим образом:

<ScrollViewer Name="ScrollViewer_Parent">
    <StackPanel PreviewMouseWheel="BubblePreviewMouseWheel">
        <Frame Name="Frame_Parent" PreviewMouseWheel="BubblePreviewMouseWheel" />
            ...
    </StackPanel>
</ScrollViewer>


private void BubblePreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    e.Handled = true;
    var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
    e2.RoutedEvent = UIElement.MouseWheelEvent;
    ((UIElement)sender).RaiseEvent(e2);
}

Редактировать: Просто понял, что это повысит событие до StackPanel, поэтому вам нужно будет также присоединить BubblePreviewMouseWheel к StackPanel.

...