【问题标题】:WPF stop ListView ScrollBar firing clickWPF 停止 ListView ScrollBar 触发点击
【发布时间】:2010-11-23 05:38:06
【问题描述】:

我正在使用带有始终可见的垂直滚动条的 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>

当垂直滚动条被点击时,不管滚动条是否有任何工作要做,是否有阻止 MouseLeftButtonUp 事件触发的方法?

【问题讨论】:

    标签: wpf listview scrollbar


    【解决方案1】:

    这类似于this question,答案是一样的。在您的 MouseLeftButtonUp 处理程序中,检查 MouseButtonEventArgs.OriginalSource 属性。这将告诉您点击的来源。

    【讨论】:

    • 在我自己的 GridView 中,我有很多包含图像、文本块、带有运行的文本块的列...我应该检查所有这些吗?
    【解决方案2】:

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

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

    【讨论】:

    • 如果你点击滚动条按钮的边框,这将允许事件触发
    【解决方案3】:

    由于ListBoxItem 中的复杂样式,其他答案都不适用于我的情况。然而,这确实:

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

    【讨论】:

    • 这也适用于我。由于列表框中的其他控件,其他答案将不起作用。谢谢
    • 如果你使用了MVVM和PassEventArgsToCommand="True"上面的解决方案也可以,你只需要用e.Source替换sender(ebeeing RoutedEventArgs)
    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 2021-06-15
    • 1970-01-01
    • 2015-04-28
    • 2017-07-02
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多