2010-01-13 8 views
9

Ich habe zwei Listenansicht auf WPF. Die erste Listenansicht wird mit einer Datentabelle geladen. Wenn Sie auf einen Eintrag in der ersten Listenansicht doppelklicken, wird das ausgewählte Objekt in die zweite Listenansicht verschoben.Wie erkennt man einen Doppelklick auf die Scrollleiste der Listenansicht?

Das Problem tritt auf, wenn in der ersten Listenansicht eine Bildlaufleiste angezeigt wird, da viele Elemente aus der DataTable geladen wurden. Wenn Sie ein Element auswählen und auf den Pfeil nach unten doppelklicken, wird das MouseDoubleClick-Ereignis gestartet und das ausgewählte Element in die zweite Listenansicht verschoben.

Wie kann ich den Doppelklick auf die Bildlaufleiste erkennen, um dies zu verhindern?

Vielen Dank!

Antwort

3

Versuchen Sie dies in Sie Mousedoubleclick-Ereignis auf dem ersten Listenansicht:

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

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

Basierend auf this.

Ich benutze dies in verschiedenen Projekten und es löst das Problem, vor dem Sie stehen.

+0

Das funktioniert gut. Nur Sie müssen dies manchmal tun'DependencyObject src = (DependencyObject) (e.OriginalSource); while (! (Src ist Control)) { src = VisualTreeHelper.GetParent (src); } 'um die richtige Kontrolle zu bekommen –

4

Ich habe den obigen Code getestet, der sehr hilfreich war, aber folgendes festgestellt hat, um stabiler zu sein, da manchmal die Quelle als GridViewRowPresenter gemeldet wird, wenn Sie tatsächlich auf ein Element doppelklicken.

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 
    }   
} 

Wenn Sie die Datacontext haben, können Sie einfach sehen, ob der Absender ein Element oder der Haupt listbox ist

+0

OP hat 4 Jahre alt. Enthält Ihre Frage zusätzliche Informationen, die ein Softwareupdate/-upgrade erfordern? Wenn ja, geben Sie an, um Missverständnisse zu vermeiden. – gmo

0

ich die endgültige Lösung haben:

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; 
} 

es funktioniert für mich.

Verwandte Themen