[WPF - NET 8.0] - Usar un Doble clic en un control Wpf ListView

Descripción general:

En este documento se describe como usar un evento [DoubleClick] en un control ListView,


↑↑↑

A modo de introducción

Necesitaba usar un evento [DoubleClick]. En un control ListView, y por alguna extraña razón, (seguro que debido a algún ataque agudo de modorrez) no lo encontré, por lo que me puse a buscar por Internet como escribir un evento personalizado .

Al final después de mirar mucho lo conseguí, y escribí esta pagina, pero nada mas subirla, descubrí la forma de declarar e interceptar un evento [MouseDoubleClick], por lo que he vuelto a modificar (y actualizar) esta pagina, para exponer como se declara ese evento y de paso, para dejar constancia de la forma de declarar cualquier evento y la forma de interceptarlo.

A) Evento estándar

Código Vb.Net


        Private Sub ListViewListaFicherosOriginales_MouseDoubleClick(
            sender As Object,
            e As MouseButtonEventArgs)Handles ListViewListaFicherosOriginales.MouseDoubleClick 

        '  Aquí hay que escribir el proceso que debe realizarse cuando se 
        '   intercepte(escuche) la pulsación de un doble click del ratón 
        End Sub 



B) Evento declarado agregando un controlador de eventos

El procedimiento que se expone a continuación también funciona sin problemas e igual de bien, pero si están los dos escuchadores de eventos, primer se dispara el del ListView y después el que hemos diseñado nosotros.

Como ya te he comentado, esta búsqueda la realice cuando pensaba que un ListView no tenia el evento [MouseDoubleClick]. Después de mirar por Internet he encontrado una solución en [stackoverflow] proporcionada por [landervdb] en el año [2010] que resuelve mi problema

Según comenta [landervdb], si se tiene una referencia al ListView, se puede usar la propiedad SelectedItem. También puede vincular SelectedItem a una propiedad en su ViewModel y luego leer el valor desde allí. Finalmente, puedes configurar IsSynchronizedWithCurrentItem en True en tu ListView y luego usar el siguiente código:

              CollectionViewSource.GetDefaultView(sourceList).CurrentItem

Pero la verdad es que no he sabido, o , podido usarlo para lo que necesitaba. Al final he mirado el código que propone, he estado jugando con el y como resuelve mi problema lo he usado.

El código que muestro a continuación esta traducido a Visual Basic y tiene alguna modificación menor, pero esta muy comentado para que se pueda seguir sin problemas


↑↑↑

Código XAML

El código siguiente hay que incluirlos en el apartado <Resources> de la ventana (o control)


        <UserControl.Resources>
        <!-- 
        Agregar un controlador de eventos DobleClic del ratón
        para usarlo con los listView, de forma que pueda hacer 
        un doble Clic en el elemento y pueda usarlo
        en un escuchador de eventos      
        -->
        <Style  TargetType="ListView">
        <EventSetter  Event="MouseDoubleClick"
        Handler="MyEventoListViewMouseDoubleClickHandler" />
        </Style>

        </UserControl.Resources>


↑↑↑

Código Vb.Net


#Region "Escuchador del evento personalizado Doble Clic" 

        ''' <summary> 
        ''' Este evento PERSONALIZADO, se dispara cuando se hace doble click 
        '''  en un elemento de un ListView 
        ''' Lo uso para mostrar el documento en una ventana nueva 
        ''' </summary> 
        ''' <param name = "sender">El objeto que dispara el evento</param> 
        ''' <param name = "e"> 
        '''    evento[MouseButtonEventArgs] con información del raton 
        ''' </param> 
        Private Sub MyEventoListViewMouseDoubleClickHandler(
        ByVal sender As Object,
        ByVal e As MouseButtonEventArgs)
        '------------------------------------------ 
        'A) Obtener el listView que dispara el evento 
        '  (Observación) También podría haberlo usado el ListView 
        '   directamente usando su nombre 
        Dim auxLV As ListView = CType(sender,ListView)

        '------------------------------------------ 
        ' B) Obtener el item(del ListView) seleccionado 
        '    y convertirlo a una instancia del objeto que contiene. 
        '  (Observacion). 
        '    El objeto[UnItemColeccionFicheros] esta diseñado para ser 
        '    usado en un proyecto que hace RENAME de ficheros. 
        '    Contiene el nombre viejo y el nombre nuevo del fichero. 
        Dim item As UnItemColeccionFicheros 
        item = CType(auxLV.SelectedItem,UnItemColeccionFicheros)

        '------------------------------------------ 
        ' C) Usar un[Process] para mostrar el[item] en una ventana nueva 
        '   [Process] se encarga de escoger el programa adecuado para mostrarlo 
        '    Ejemplo, si es una imagen usara el programa de windows[Fotos] 
        '    para mostrarlo. Si es un documento PDF, usara el visor PDF 
        '    registrado en Windows 
        Using proceso As New System.Diagnostics.Process 
         With  proceso 

        '------------------------------------------ 
        '[FileName] 
        ' Establece la aplicación o el documento que se va a iniciar 
        ' Debe establecer al menos la FileName propiedad 
        ' antes de iniciar el proceso. 
        ' El nombre de archivo es cualquier aplicación o documento. 
        ' Un documento se define como cualquier tipo de archivo que 
        ' tenga asociada una acción abierta o predeterminada. 
        ' Ejemplo.StartInfo.FileName = "http://www.microsoft.es" 
        ' Ejemplo.StartInfo.FileName = "E:\CañonAñiscloCarretera.jpg" 
        ' 
        ' El conjunto de tipos de archivo disponibles depende en parte 
        ' del valor de la propiedad[UseShellExecute]. 
        '[True]  Si toma este valor, puede iniciar cualquier 
        '         documento y realizar operaciones en el archivo, 
        '         como imprimir, con el componente Process. 
        '[False] Cuando toma este valor, solo puede iniciar 
        '         ejecutables con el componente Process. 
        ' 
         .StartInfo.FileName = item.FicheroViejoFI.FullName 

        '------------------------------------------ 
        '[Propiedad Arguments] 
        ' OJO esta propiedad provoca un ERROR de fichero no encontrado 
        '.StartInfo.Arguments = "http://www.microsoft.es" 

        '------------------------------------------ 
        '[UseShellExecute] Indica si se va a usar el shell del 
        ' sistema operativo para iniciar el proceso. 
         .StartInfo.UseShellExecute  = True 

        '------------------------------------------ 
        '[CreateNoWindow]  Indica si el proceso se va a iniciar en 
        '  una nueva ventana. 
        .StartInfo.CreateNoWindow = True 

        '------------------------------------------ 
        '[Start] Inicia un proceso y lo asocia a un componente Process. 
               .Start()

        End With 
        End Using 

        e.Handled = True 
        End Sub 

#End Region 

Y eso es todo (de momento)