在 ScrollViewer child 的 Frame 中禁用滚动,该 Frame 的 ScrollViewer 为 parent

Disable scrolling in ScrollViewer child of a Frame which has a ScrollViewer as parent

我有一个 Page (Page_Child) 和一个 ScrollViewer (ScrollViewer_Child) 在 Frame (Frame_Parent) 这是我的 parent ScrollViewer (ScrollViewer_Parent).

的 child
<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>

问题

我试图实现的是禁用 Frame 中的 ScrollViewer 因为 parent ScrollViewer 可以处理所有占用,这要归功于高度不固定的 Frame。 - 或者至少让 parent 在 child 到达顶部或底部时继续滚动。

遗憾的是我不能使用任何外部资源或库,我也不能删除 child ScrollViewer 因为它在我的应用程序的其他地方可视化。

问题

有没有办法告诉框架内容禁用滚动或如何存档继续滚动框架?

如果您能够使用外部库,您可以使用此处的行为:BubbleScrollEvent Behaviour,但如果您不能,您可以简单地在后面的代码中编写类似的东西;

通过将方法附加到 FramePreviewMouseWheel 事件,这会将事件路由到 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