4

执行以下操作将重现我的问题:

  • 新的 WPF 项目
  • 添加列表视图
  • 命名列表视图:x:Name="lvList"
  • 将足够的 ListViewItems 添加到 ListView 以完全填充列表,以便在运行时出现垂直滚动条。
  • 将此代码放在 lvList.MouseDoubleClick 事件中

Debug.Print("双击发生")

  • 运行应用程序
  • 双击滚动条的 LargeChange 区域(不是滚动“条”本身)
  • 注意打印 ListView 的双击发生消息的即时窗口

如何更改此行为,以便 MouseDoubleClick 仅在鼠标“悬停” ListViewItems 时发生,而不是在连续单击 ScrollViewer 以在列表中向下/向上滚动时发生?

4

4 回答 4

5

您无法更改该行为,因为 MouseDoubleClick 处理程序附加到 ListView 控件,因此无论何时单击 ListView 都必须发生它——任何地方。你可以做什么检测 ListView 的哪个元素首先检测到双击,并从那里确定它是否是 ListViewItem。这是一个简单的例子(省略错误检查):

private void lv_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
  DependencyObject src = (DependencyObject)(e.OriginalSource);
  while (!(src is Control))
    src = VisualTreeHelper.GetParent(src);
  Debug.WriteLine("*** Double clicked on a " + src.GetType().Name);
}

请注意使用 e.OriginalSource 来查找被双击的实际元素。这通常是非常低级别的东西,例如 Rectangle 或 TextBlock,因此我们使用 VisualTreeHelper 走到包含控件。在我的简单示例中,我假设我们点击的第一个控件将是 ListViewItem,如果您正在处理包含例如文本框或复选框的 CellTemplate,则情况可能并非如此。但是您可以轻松地改进测试以仅查找 ListViewItems ——但在这种情况下,不要忘记处理单击在任何 ListViewItem 之外的情况,并且搜索最终会命中 ListView 本身。

于 2010-03-20T23:05:45.490 回答
1

也许这有帮助?

Private Sub LstView_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles LstView.MouseDoubleClick
    Dim source As FrameworkElement = TryCast(e.OriginalSource, FrameworkElement)
    If IsNothing(source) Then Return

    Dim TmplParent As DependencyObject = TryCast(source.TemplatedParent, DependencyObject)
    If IsNothing(TmplParent) Then Return
    If Not TmplParent.GetType.Equals(GetType(System.Windows.Controls.ListViewItem)) Then e.Handled = True
End Sub
于 2011-04-14T06:14:24.420 回答
0

我没有方便的 VS 来测试这是否有效,但是您是否尝试过处理 ListViewItems 上的双击事件而不是 ListView 本身?

<ListView ListViewItem.MouseDoubleClick="lv_MouseDoubleClick" ... />

这应该处理 ListView 内任何子 ListViewItem 控件上的 MouseDoubleClick 事件。让我们知道它是否有效!

于 2010-03-20T23:16:09.900 回答
0
  <Style TargetType="{x:Type ListViewItem}">           
            <EventSetter Event="MouseDoubleClick" Handler="OnListViewDoubleClick" />
        </Style>

如果你应用这种风格,它会起作用。只需双击列表视图中的项目即可。

此外,您必须从列表视图中删除双击。

于 2013-06-26T10:12:34.363 回答