2010-01-13 47 views
9

Tengo dos vistas de lista en WPF. La primera vista de lista se carga con una tabla de datos. Al hacer doble clic en un elemento de la primera vista de lista, el elemento seleccionado se mueve a la segunda vista de lista.Cómo detectar doble clic en la vista de la lista barra de desplazamiento?

El problema surge cuando aparece una barra de desplazamiento en la primera vista de lista debido a una gran cantidad de elementos cargados desde DataTable. Si selecciona un elemento y hace doble clic en la flecha hacia abajo de la barra de desplazamiento, se inicia el evento MouseDoubleClick y el elemento seleccionado se mueve a la segunda vista de lista.

¿Cómo puedo detectar el doble clic en la barra de desplazamiento para evitar esto?

¡Muchas gracias!

Respuesta

3

probar este evento en el que MouseDoubleClick en el primer Listview:

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

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

Basado en this.

Estoy usando esto en varios proyectos y resuelve el problema que está enfrentando.

+0

Esto funciona bien. Solo tiene que hacer esto a veces'DependencyObject src = (DependencyObject) (e.OriginalSource); while (! (Src es Control)) { src = VisualTreeHelper.GetParent (src); } 'para obtener el control adecuado –

4

Probé el código anterior que fue muy útil, pero encontré que lo siguiente es más estable, ya que a veces la fuente se informa como GridViewRowPresenter cuando en realidad está haciendo doble clic en un elemento.

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

Cuando se tiene el DataContext se puede ver fácilmente si el remitente es un elemento o el cuadro de lista principal

+0

OP tiene 4 años de antigüedad. ¿Su pregunta agrega información adicional que involucra una actualización/actualización de software? De ser así, especifique para evitar malentendidos. – gmo

0

Tengo la solución final:

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

que funciona para mi.

Cuestiones relacionadas