【问题标题】:Disable scrolling in ScrollViewer child of a Frame which has a ScrollViewer as parent在具有 ScrollViewer 作为父级的 Frame 的 ScrollViewer 子级中禁用滚动
【发布时间】:2019-05-23 07:51:18
【问题描述】:

状态

我有一个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>

问题

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

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

问题

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

【问题讨论】:

  • 如果框架接收到鼠标滚轮事件,它将冒泡到滚动查看器。我之前在这里使用过stackoverflow.com/a/16110178/5084488 的解决方案,效果非常好
  • @Alfie 不能为我的应用程序使用任何 DLL 或外部资源(只能使用标准 Windows 库和 .NET 4.0):/
  • 哦,好吧,您可以尝试做同样的事情,但只是在后面的代码中通过将 void Frame_Parent_PreviewMouseWheel(object sender, MouseWheelEventArgs e) { e.Handled = true; ScrollViewer_Parent.RaiseEvent(e); } 附加到 Frame_Parent 的 PreviewMouseWheel 事件?还是我误解了你?
  • 我误解了你,你的解决方案是完美的,虽然我需要这个互动的东西 - 你想写一个答案,以便我可以给你接受的答案徽章吗?

标签: c# wpf .net-4.0 frame scrollviewer


【解决方案1】:

如果您能够使用外部库,则可以使用此处的行为: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多