scrollviewer里面的Listview阻止了scrollviewer滚动

Con*_*cer 19 c# wpf listbox scrollviewer

我有一个滚动查看器,里面有几个列表框.问题是如果用户使用鼠标中键滚动滚动查看器,而鼠标位于列表视图上方.列表视图将其内部滚动查看器滚动到底部,然后继续捕获鼠标,防止包含滚动查看器滚动.

关于如何处理这个问题的任何想法?

Kos*_*Kos 44

发生这种情况是因为ListView's(ListBox实际上)的内容模板用自己的东西包装了它的项目ScrollViewer.

最简单的方法是通过放弃自己Template的内部来禁用它ListView,一个不创建ScrollViewer:

    <ListView>
      <ListView.Template>
        <ControlTemplate>
          <ItemsPresenter></ItemsPresenter>
        </ControlTemplate>
      </ListView.Template>
      ...
    </ListView>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你在ListView中有一个ListView(这是我的情况),也会发生同样的情况.


Pop*_*yto 8

IMO,处理这种情况的最佳方法是创建一个自定义控件:

     class MyScrollViewer : ScrollViewer
     {
         protected override void OnPreviewMouseWheel(MouseWheelEventArgs e)
         {
            base.OnPreviewMouseWheel(e);
            if (!e.Handled)
            {
                e.Handled = true;
                this.RaiseEvent(new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
                {
                    RoutedEvent = UIElement.MouseWheelEvent,
                    Source = this
                });
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 您的答案是最好的,因为其他答案将删除标题,要解决此问题,您将需要从地面实现 ScrollViewer 请参阅[ref1](/sf/ask/3690330451/自定义滚动查看器导致列标题消失)[帮助](/sf/ask/1454894521/添加标题) (2认同)

Rac*_*hel 5

你有没有尝试禁用ListView's ScrollBars

<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled"
          ScrollViewer.VerticalScrollBarVisibility="Disabled" />
Run Code Online (Sandbox Code Playgroud)


Vim*_*mes 5

受到一些 有用 答案的启发,我有一个实现,当内部滚动视图(包括来自 ListView、ListBox、DataGrid)滚动经过其顶部/底部时,滚动祖先 ScrollViewers。

我将附加属性应用于 App.xaml 中的所有 ScrollViewers:

<Style TargetType="ScrollViewer" BasedOn="{StaticResource {x:Type ScrollViewer}}">
    <Setter Property="local:ScrollViewerHelper.FixMouseWheel" Value="True" />
</Style>

Run Code Online (Sandbox Code Playgroud)

附加属性检测滚动超过顶部/底部,当发生这种情况时,会在 ScrollViewer 的父级上引发鼠标滚轮事件。事件路由将其获取到外部 ScrollViewer:

<Style TargetType="ScrollViewer" BasedOn="{StaticResource {x:Type ScrollViewer}}">
    <Setter Property="local:ScrollViewerHelper.FixMouseWheel" Value="True" />
</Style>

Run Code Online (Sandbox Code Playgroud)