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)