执行以下操作将重现我的问题:
Debug.Print(“双击发生”)
如何更改此行为,以便MouseDoubleClick仅在鼠标“覆盖”ListViewItems时发生,而不是在连续单击ScrollViewer以在列表中向下/向上滚动时发生?
答案 0 :(得分: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,如果您正在处理包含例如CellTemplates的CellTemplates,则可能不是这种情况。文本框或复选框。但是您可以轻松地优化测试以仅查看ListViewItems - 但在这种情况下,不要忘记处理单击在任何ListViewItem之外的情况,并且搜索最终会击中ListView本身。
答案 1 :(得分: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
答案 2 :(得分:0)
我没有VS方便测试这是否有效,但您是否尝试过处理ListViewItems上的双击事件而不是ListView本身?
<ListView ListViewItem.MouseDoubleClick="lv_MouseDoubleClick" ... />
这应该处理ListView中任何子ListViewItem控件上的MouseDoubleClick事件。如果有效,请告诉我们!
答案 3 :(得分:0)
<Style TargetType="{x:Type ListViewItem}">
<EventSetter Event="MouseDoubleClick" Handler="OnListViewDoubleClick" />
</Style>
如果您应用此样式,则可以使用。只需双击列表视图中的项目即可。
另外,您必须从列表视图中删除双击。