暂时禁用ScrollViewer的滚动功能

3
我有一个包含ItemPresenterScrollViewerItemsPresenter包含几个下拉菜单,当我打开其中一个时,我希望禁用父级ScrollViewer的滚动,并仅在关闭下拉框时重新启用它。
所谓“禁用”,是指完全防止滚动(即使使用鼠标滚轮)。
我尝试将VerticalScrollBarVisibility设置为Disabled,如下所示:
<ScrollViewer HorizontalScrollBarVisibility="Disabled"
              VerticalScrollBarVisibility="Disabled">
   <ItemsPresenter />
</ScrollViewer>

但这也不起作用。
它只是隐藏了滚动条,但鼠标滚轮仍然可以使用

那么,有没有一种方法可以完全禁用ScrollViewer的滚动?

以下是我现在拥有的完整代码:

<ListView.Template>
   <ControlTemplate>
      <ScrollViewer HorizontalScrollBarVisibility="Disabled"
                    VerticalScrollBarVisibility="{Binding IsScrollEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
         <ItemsPresenter />
      </ScrollViewer>
   </ControlTemplate>
</ListView.Template>

附注:有很多类似的问题,例如这个这个,但它们都不是我想要的。


你的转换器可能会返回Hidden来隐藏滚动条,但这只是隐藏了滚动条,但仍然可以滚动。它应该返回Disabled,这样就可以防止滚动。 - mami
不,它返回的是“已禁用”。奇怪的是,即使我在那里直接硬编码“已禁用”(请参见第一个示例),它仍然无法工作。 - Just Shadow
1个回答

3
您可以通过处理ScrollViewerPreviewMouseWheel事件来禁用滚动。
<ScrollViewer HorizontalScrollBarVisibility="Disabled"
              VerticalScrollBarVisibility="{Binding IsScrollEnabled, Converter={StaticResource BoolToVisibilityConverter}}"
              PreviewMouseWheel="UIElement_OnPreviewMouseWheel">
   <ItemsPresenter />
</ScrollViewer>

private void UIElement_OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
   e.Handled = true;
}

哇,太棒了!我尝试过“MouseWheel”事件,但不知道还有“PreviewMouseWheel”。非常感谢! - Just Shadow
这也会防止键盘滚动吗? - mami
1
@miami 不可以,但你也可以使用“PreviewKey…”事件来处理相应的键。 - thatguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接