2010-01-13 3 views
9

J'ai deux vue de liste sur WPF. Le premier listview est chargé avec un Datatable. Lorsque vous double-cliquez sur un élément de la première liste, l'élément sélectionné est déplacé vers la deuxième liste.Comment détecter un double clic sur la barre de défilement de la liste?

Le problème se pose lorsque apparaît une barre de défilement dans la première vue de liste en raison d'un grand nombre d'éléments chargés à partir du DataTable. Si vous sélectionnez un élément et double-cliquez sur la flèche vers le bas de la barre de défilement, l'événement MouseDoubleClick est lancé et l'élément sélectionné est déplacé vers la deuxième liste.

Comment puis-je détecter le double clic sur la barre de défilement pour éviter cela?

Merci beaucoup!

Répondre

3

Essayez ceci dans votre événement MouseDoubleClick le premier Listview:

DependencyObject src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource); 

if(src is Control && src.GetType() == typeof(ListViewItem)) 
{ 
    // Your logic here 
} 

Basé sur this. Je l'utilise dans divers projets et il résout le problème que vous rencontrez.

+0

Cela fonctionne très bien. Seulement vous devez faire ceci parfois 'DependencyObject src = (DependencyObject) (e.OriginalSource); while (! (Src is Control)) { src = VisualTreeHelper.GetParent (src); } 'pour obtenir le bon contrôle –

4

J'ai testé le code ci-dessus qui a été très utile, mais j'ai trouvé que le code suivant était plus stable, car parfois la source est signalée comme GridViewRowPresenter alors qu'en fait vous double-cliquez sur un élément.

var src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource); 
var srcType = src.GetType(); 
if (srcType == typeof(ListViewItem) || srcType == typeof(GridViewRowPresenter)) 
{ 
    // Your logic here 
} 
2
private void ListBox_OnMouseDoubleClick(object pSender, MouseButtonEventArgs pE) 
{ 
    FrameworkElement originalSource = pE.OriginalSource as FrameworkElement; 
    FrameworkElement source = pE.Source as FrameworkElement; 

    if (originalSource.DataContext != source.DataContext) 
    { 
     logic here 
    }   
} 

Lorsque vous avez DataContext vous pouvez facilement voir si l'expéditeur est un élément ou la liste principale

+0

OP a 4 ans. Est-ce que votre question ajoute des informations supplémentaires qui impliquent une mise à jour/mise à jour logicielle? Si oui, spécifiez pour éviter les malentendus. – gmo

0

J'ai la solution finale:

private void ListView_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    var originalSource = (DependencyObject)e.OriginalSource; 
    while ((originalSource != null) && !(originalSource is ListViewItem)) originalSource = VisualTreeHelper.GetParent(originalSource); 
    if (originalSource == null) return; 
} 

il fonctionne pour moi.

Questions connexes