【问题标题】:Disable the scroll of the ScrollViewer for a while暂时禁用 ScrollViewer 的滚动
【发布时间】:2020-08-06 13:14:33
【问题描述】:

我有一个ScrollViewer,里面有一个ItemPresenterItemsPresenter 包含一些下拉菜单,当我打开其中一个时,我想禁用父 ScrollViewer 的滚动,并且只有在 Dropbox 关闭时才重新启用它。
说“禁用”是指完全阻止滚动(即使使用鼠标滚轮)。

我尝试将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>

附: likethis 和 this 有很多类似的问题,但没有一个是我想要的。

【问题讨论】:

  • 您的转换器可能会返回 Hidden 以获得可见性,但这只会隐藏 ScrollBar,但仍然可以滚动。它应该返回 Disabled 来阻止滚动。
  • 不,它返回“已禁用”。奇怪的是,即使我在那里硬编码“禁用”(参见第一个示例),它仍然无法工作。

标签: c# .net wpf xaml mvvm


【解决方案1】:

您可以通过处理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”。非常感谢!
  • 这是否也会阻止键盘滚动?
  • @miami 没有,但您也可以使用PreviewKey... 事件处理相应的键。
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多