ScrollViewer鼠标滚轮无法正常工作

sad*_*iju 53 .net c# wpf mousewheel scrollviewer

我目前正在开发我的第一个WPF项目并试图使listview可滚动.起初我认为这可以通过简单地限制列表视图的宽度和高度来轻松完成,从而当内容超出其空间时强制滚动条自动出现.这看起来很好,但由于处理的PreviewMouseDown-Event(可以拖动列表的项目),它在选择项目后不起作用.

第二次尝试(使用ScrollViewer)

<ScrollViewer>
    <ListView ItemsSource="{Binding FileViewModels}"
              PreviewMouseDown="ListView_MouseMove"
              Height="450" Width="200"/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

当然,只要列表的内容大于其最大高度,就会产生第二个滚动条.选择项目后拖动栏仍然无效.

第三次(非常愚蠢)尝试(禁用滚动条复制)

<ScrollViewer>
    <ListView ItemsSource="{Binding FileViewModels}"
              PreviewMouseDown="ListView_MouseMove"
              Height="450" Width="200"
              ScrollViewer.VerticalScrollBarVisibility="Disabled"
              ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

这删除了滚动条复制并启用了通过鼠标滚轮滚动但禁用了滚动条,因此您无法通过单击并拖动它来移动.

第四次尝试(ScrollViewer的常量)

<ScrollViewer Height="450" Width="200">
    <ListView ItemsSource="{Binding FileViewModels}"
              PreviewMouseDown="ListView_MouseMove"/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

从ListView中删除了宽度/高度约束并将其移动到ScrollViewer.这将启用滚动条并删除重复项.不幸的是鼠标滚轮不再工作(拖动滚动条工作正常).

有人可以向我解释为什么鼠标滚轮不再工作以及如何解决这个问题?

编辑 也许我应该回到我的第一个解决方案.显然,ListView的模板已经包含ScrollViewer.剩下的问题是,由于处理的PreviewMouseDown事件,我在选择项目后无法拖动滚动条(在这种情况下,通过鼠标滚轮滚动仍然有效).我是否应该以不同的方式处理项目的拖动(在我想要添加滚动条之前,它对我来说很好)?或者有没有办法检测光标是否在滚动条上方(这样我就可以取消选择能够滚动的项目)?或者还有其他建议吗?

Roc*_*cky 88

这可能对你有帮助..

private void ListViewScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
   ScrollViewer scv = (ScrollViewer)sender;
   scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
   e.Handled = true;
 }
Run Code Online (Sandbox Code Playgroud)

  • 我发现将 `e.Delta` 除以 10 可以使滚动的粒度更细(不那么粗)。(不过,很好的答案!) (2认同)

Dbl*_*Dbl 19

这可能是最舒适的解决方案:

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

  • 最佳方案.可能会将Itemspresenter放入"Grid"或"DockPanel"中 (4认同)

小智 9

<ScrollViewer Background="Transparent">
Run Code Online (Sandbox Code Playgroud)

如果Background为null,则鼠标滚轮将无法在ScrollViewer上运行.您可以将背景设置为透明或其他值.

  • 这仅对我有效,如果鼠标指针位于滚动条上方,但不适用于内容 (4认同)

小智 5

就我而言,这有帮助:

<ScrollViewer ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Auto" >
    <DataGrid x:Name="dataGrid" SelectionMode="Single" ItemsSource="{Binding}"  SelectedValuePath="{Binding Item}" AutoGenerateColumns="True">
    </DataGrid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

该设计VerticalScrollBarVisibility在外部范围内禁用属性,即在ScrollViewer.


J P*_*ack 5

对我来说,这工作:

<ListView.Template>
    <ControlTemplate>
        <!-- Empty template to allow ScrollViewer to capture mouse scroll -->
        <ItemsPresenter />
    </ControlTemplate>
</ListView.Template>
Run Code Online (Sandbox Code Playgroud)

代替这个:

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