ScrollViewer鼠标滚轮不工作

我目前正在做我的第一个WPF项目,并试图做一个ListView滚动。 起初,我认为这可以很容易地通过简单地限制列表视图的宽度和高度,从而迫使一个滚动条自动出现,每当内容超过其空间。 这看起来很好,但由于处理PreviewMouseDown事件(这使拖动列表的项目)select一个项目后,它不起作用。

第二次尝试 (使用ScrollViewer)

<ScrollViewer> <ListView ItemsSource="{Binding FileViewModels}" PreviewMouseDown="ListView_MouseMove" Height="450" Width="200"/> </ScrollViewer> 

当然,当列表的内容变得大于最大高度时,这会导致第二个滚动条。 select一个项目后,拖动栏仍然不起作用。

第三 (相当愚蠢的) 尝试 (禁用滚动条复制)

 <ScrollViewer> <ListView ItemsSource="{Binding FileViewModels}" PreviewMouseDown="ListView_MouseMove" Height="450" Width="200" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled"/> </ScrollViewer> 

这删除了滚动条复制,并通过鼠标滚轮启用滚动,但禁用滚动条,所以你不能通过点击和拖动它。

第四次尝试 (ScrollViewer的大小不变)

 <ScrollViewer Height="450" Width="200"> <ListView ItemsSource="{Binding FileViewModels}" PreviewMouseDown="ListView_MouseMove"/> </ScrollViewer> 

从ListView中移除宽度/高度约束并将其移至ScrollViewer。 这使滚动条和删除重复。 不幸的是,鼠标滚轮不再工作(拖动滚动条工作正常)。

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

编辑也许我应该回到我的第一个解决scheme。 显然,ListView的模板已经包含了一个ScrollViewer。 剩下的问题就是因为处理过的PreviewMouseDown事件(在这种情况下通过鼠标滚动仍然有效)select一个项目后,我不能拖动滚动条。 我是否应该以不同的方式处理项目的拖动(在我想添加滚动条之前,它可以正常工作)? 或者有没有办法来检测光标是否在滚动条上方(这样我可以取消select启用滚动的项目)? 或者还有其他build议吗?

这可能会帮助你..

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

这可能是最舒适的解决scheme:

  <ListView.Template> <ControlTemplate> <ScrollViewer> <ItemsPresenter></ItemsPresenter> </ScrollViewer> </ControlTemplate> </ListView.Template> 
 <ScrollViewer Background="Transparent"> 

如果背景为空,则鼠标滚轮在ScrollViewer上不起作用。 您可以将“背景”设置为“透明”或其他值。

在我的情况下:

 <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> 

该devise是禁用外部范围的VerticalScrollBarVisibility属性,即在ScrollViewer中

试试看你的鼠标是否正在工作或不按照以下方法private void timerRefresh_Tick(object sender, EventArgs e) { txtbtnhead.Text=Cursor.Position.ToString(); } private void timerRefresh_Tick(object sender, EventArgs e) { txtbtnhead.Text=Cursor.Position.ToString(); }