如何使操作事件在包含ScrollViewer子项的元素上工作

本文关键字:元素 工作 ScrollViewer 操作 何使 事件 包含 | 更新日期: 2023-09-27 18:28:35

假设我有以下XAML:

<Grid ManipulationMode="TranslateY" ManipulationDelta="Grid_ManipulationDelta">
    <ScrollViewer HorizontalScrollMode="Enabled" VerticalScrollMode="Disabled" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Hidden">
        <StackPanel Orientation="Horizontal">
            <Rectangle Width="100" Height="100" Fill="Red" />
            <Rectangle Width="100" Height="100" Fill="Blue" />
            <Rectangle Width="100" Height="100" Fill="Red" />
            <Rectangle Width="100" Height="100" Fill="Blue" />
            <Rectangle Width="100" Height="100" Fill="Red" />
            <Rectangle Width="100" Height="100" Fill="Blue" />
            <Rectangle Width="100" Height="100" Fill="Red" />
            <Rectangle Width="100" Height="100" Fill="Blue" />
        </StackPanel>
    </ScrollViewer>
</Grid>

(StackPanel只是任意内容。)

我希望网格只处理TranslateY操作事件,而ScrollViewer只水平滚动;然而,即使操作是垂直的而不是水平的,ScrollViewer也会优先。Grid从不接收ManipulationDelta事件,除非我禁用ScrollViewer上的滚动,这显然不是我想要的。

这与ScrollViewer直接操纵事件的"神奇"行为有关吗?我也尝试过不同的"rails"设置组合(即在ScrollViewer上将Grid的ManipulationMode设置为TranslateRailsY,将IsHorizontalRailEnabled设置为true),但仍然不起作用。

如何使操作事件在包含ScrollViewer子项的元素上工作

没错,ScrollViewer的父元素不会接收操作事件,因为它们被ScrollViewer直接操作

然而,ScrollViewer内的元素将能够接收它们,只要它们的ManipulationMode包括System模式。

在您的特定情况下,您将希望在StackPanel上监视ManipulationDelta事件,并将其ManipulationMode设置为TranslateY,System

另外,不要忘记为您的StackPanel提供接收事件的Transparent背景。

<StackPanel Background="Transparent" ManipulationMode="TranslateY,System" ManipulationDelta="StackPanel_ManipulationDelta">

ScrollViewer将操作事件标记为已处理,从而使其不会冒泡到网格中。你必须改变这种行为。

您可以从ScrollViewer订阅ManipulationStarted事件。有关该事件的文档应该会让您开始。