【发布时间】:2013-04-20 12:21:10
【问题描述】:
我目前正在处理我的第一个 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 滚动仍然有效),我无法在选择项目后拖动滚动条。我是否应该以不同的方式处理项目的拖动(在想要添加滚动条之前,它对我来说效果很好)?或者有没有办法检测光标是否在滚动条上方(所以我可以取消选择启用滚动的项目)?
或者有其他建议吗?
【问题讨论】:
标签: c# wpf xaml scrollviewer mousewheel