WPF ListView ScrollViewer Событие двойного щелчка - PullRequest
4 голосов
/ 21 марта 2010

Выполнение ниже будет воспроизвести мою проблему:

  • Новый проект WPF
  • Добавить ListView
  • Назовите список просмотра: x: Name = "lvList"
  • Добавьте достаточно ListViewItems в ListView, чтобы полностью заполнить список, чтобы во время выполнения появлялась вертикальная полоса прокрутки.
  • Поместите этот код в событие lvList.MouseDoubleClick

Debug.Print («Произошел двойной щелчок»)

  • Запустите приложение
  • Дважды щелкните область LargeChange полосы прокрутки (а не самой полосы прокрутки)
  • Обратите внимание на окно «Немедленно», в котором выводится сообщение о двойном щелчке для ListView

Как изменить это поведение, чтобы MouseDoubleClick происходило только тогда, когда мышь находится «над» ListViewItems, а не при постоянном нажатии ScrollViewer для прокрутки вниз / вверх в списке?

Ответы [ 4 ]

5 голосов
/ 21 марта 2010

Вы не можете изменить поведение, потому что обработчик 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, которые содержат, например, текстовые поля или флажки. Но вы можете легко уточнить тест, чтобы искать только ListViewItems - но в этом случае не забудьте обработать случай, когда щелчок находится вне любого ListViewItem, и поиск в конечном итоге попадает в сам ListView.

1 голос
/ 14 апреля 2011

Может быть, это поможет?

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
0 голосов
/ 26 июня 2013
  <Style TargetType="{x:Type ListViewItem}">           
            <EventSetter Event="MouseDoubleClick" Handler="OnListViewDoubleClick" />
        </Style>

Если вы примените этот стиль, он работает. Двойной щелчок по элементу в списке будет работать.

также необходимо удалить двойной щелчок из списка.

0 голосов
/ 21 марта 2010

У меня нет VS, чтобы проверить, работает ли это, но вы пытались обработать событие двойного щелчка в ListViewItems, а не в самом ListView?

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

Это должно обрабатывать событие MouseDoubleClick в любом дочернем элементе управления ListViewItem внутри ListView. Дайте нам знать, если это работает!

...