如何使操作事件在包含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
内的元素将能够接收它们,只要它们的ManipulationMode
包括System
模式。StackPanel
上监视ManipulationDelta
事件,并将其ManipulationMode
设置为TranslateY,System
。StackPanel
提供接收事件的Transparent
背景。<StackPanel Background="Transparent" ManipulationMode="TranslateY,System" ManipulationDelta="StackPanel_ManipulationDelta">
ScrollViewer将操作事件标记为已处理,从而使其不会冒泡到网格中。你必须改变这种行为。
您可以从ScrollViewer订阅ManipulationStarted事件。有关该事件的文档应该会让您开始。