最佳答案
我目前正在做我的第一个 WPF 项目,并试图使 ListView
可滚动。
起初,我认为这可以很容易地做到这一点,只要限制 ListView
的宽度和高度,从而迫使一个滚动条自动出现时,内容超过其空间。这在一开始看起来没什么问题,但是由于处理过的 PreviewMouseDown
事件(它允许拖动列表中的项目) ,它在选择了一个项目之后就不起作用了。
第二次尝试 (使用 ScrollViewer
)
<ScrollViewer>
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"
Height="450" Width="200"/>
</ScrollViewer>
当然,只要列表的内容大于其最大高度,就会产生第二个滚动条。在选择一个项目之后,拖动条仍然不起作用。
第三个 (相当愚蠢) 尝试(禁用滚动条重复)
<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
。这将启用滚动条并删除重复的。不幸的是,鼠标轮不再工作(拖动滚动条工作正常)。
谁能给我解释一下为什么鼠标轮不能用了还有怎么解决这个问题?
剪辑 也许我应该回到我的第一个解决方案。
显然,ListView
的模板已经包含了 ScrollViewer
。剩下的问题是,我不能拖动滚动条后选择一个项目,因为处理的 PreviewMouseDown
事件(通过 MouseWheel 滚动仍然工作在这种情况下)。我是否应该以不同的方式处理拖动项目(在添加滚动条之前,它对我来说工作得很好) ?或者有没有办法检测光标是否在滚动条上方(这样我就可以取消选择启用滚动的项目) ?
还有其他建议吗?