WPF如何停止ListView的滚动条触发点击事件

8
我正在使用一个带有始终可见垂直滚动条的WPF ListView。我在ListView上有一个MouseLeftButtonUp事件处理程序。该处理程序正常工作,但当垂直滚动条被点击时却没有任何操作,即ListView框中没有足够的项目进行任何滚动时,会出现问题。
在这种情况下,由于用户只是为了确保没有项目刚好在屏幕外而单击了垂直滚动条,因此不应发生任何事情。然而,ListView触发了MouseLeftButtonUp事件。如果垂直滚动条确实有一些工作要做,则不会触发该事件。
以下是我简化后的XAML。
<ListView MouseLeftButtonUp="DoSomething_MouseLeftButtonUp" SelectionMode="Single" ScrollViewer.VerticalScrollBarVisibility="Visible">
  <ListView.View>
    <GridView>
      <GridViewColumn Width="170" Header="Venue" DisplayMemberBinding="{Binding Path=Venue}" />
    </GridView>
  </ListView.View>
</ListView>

无论滚动条是否有工作需要执行,都有没有办法阻止鼠标左键松开事件在垂直滚动条被单击时触发吗?

3个回答

8

由于 ListBoxItem 中存在复杂的样式,其他答案在我的情况下都不起作用。但是以下方法可以解决:

var item = ItemsControl.ContainerFromElement(sender as ItemsControl, (DependencyObject)e.OriginalSource) as ListBoxItem;
if (item != null)
{
    // Handle it
}

这对我也有效。其他答案由于列表框中的其他控件而无法工作。谢谢。 - superstar
如果您使用了MVVM和PassEventArgsToCommand="True",上面的解决方案也适用,您只需要将sender替换为e.Source(其中e是RoutedEventArgs)。 - Sebastien Servouze

4

这与此问题类似,答案也相同。在您的MouseLeftButtonUp处理程序中,检查MouseButtonEventArgs.OriginalSource属性。那会告诉您点击的来源。


在我的GridView中,我有许多包含图像、文本块、带有Runs的文本块的列...我应该检查所有这些吗? - Dave Haynes

2

对于 ListBox,我使用了以下代码:

 if (e.OriginalSource is TextBlock || e.OriginalSource is Border)
 {
     // do your stuff
 }

如果您点击滚动条按钮的边框,这将允许事件触发。 - Sebastien Servouze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接