Pequeño apunte que muestra como se usa Drag and Drop, para mostrar en un control el nombre de un directorio
Arrastrar y soltar significa que selecciona uno o más archivos y los arrastra a otra ubicación a otro control.
Dragging, acción de mantener presionado un botón (down) del mouse.
Dropping, acción de liberar un botón (up) del mouse.
Existen 2 tipos de drag y drop:
Los eventos que intervienen en una operación Drag and Drop (Arrastrar y soltar) son los siguientes:
La diferencia entre un evento y su evento "Preview" [DragEnter y PreviewDragEnter ] es que este último es un evento enrutado y es el que hay que procurar usar en las aplicaciones wpf
Para que se activen las operaciones de Arrastar y soltar la propiedad AllowDrop debe tener el valor "True"
El evento DragEventArgs dispone de varias propiedades muy interesantes:
En general permite realizar dos comprobaciones muy importantes:
Se desencadena cuando el ratón sale del control. Normalmente que el ratón salga de un control significa que se inicia la operación de arrastre
Normalmente se usa para ocultar las señales visuales que se están exhibiendo actualmente
Una Observación: Este evento se desencadena repetidamente, incluso si no se mueve el ratón.
Dependiendo de lo que lo hace nuestra aplicación, y de lo que haga nuestro código, puede llegar a usar un tiempo considerable en su ejecución
Se suele usar para mostrar las señales visuales (Copiar, Pegar, None) cuando el usuario mueve el ratón.
Se desencadena cuando el ratón entra en un control en el que Drag and Drop está habilitado. Te da la oportunidad de:
Se desencadena cuando soltamos el botón derecho del ratón sobre el control
#Region "Drag and drop Version [2016/01/16] " '-------------------------------- 'BUG [2012/12/02] 'Las funciones de Drag and drop, presentan un error si se tiene 'activada la referencia [Sytem.Windows.Forms]. 'La única manera de evitar el problema que he encontrado es 'usar el nombre completo en todos los objetos que 'intervienen en las funciones '-------------------------------- '---------------------------------------------- Private Sub EventoPreviewDragOver(ByVal sender As Object, ByVal args As System.Windows.DragEventArgs) ' Marcar el evento como controlado args.Handled = True End Sub '---------------------------------------------- ' el destino real Private Sub EventoPreviewDragEnter(ByVal sender As Object, ByVal args As System.Windows.DragEventArgs) ' Como decisión de diseño arbitraria, queremos trabajar con un solo archivo. If String.IsNullOrWhiteSpace(GetDirectorioArrastrado(args)) = False Then args.Effects = System.Windows.DragDropEffects.Copy Else args.Effects = System.Windows.DragDropEffects.None End If ' Marcar el evento como controlado args.Handled = True End Sub '---------------------------------------------- ' aquí se efectúa el pegado / copiado Private Sub EventoPreviewDrop(ByVal sender As Object, ByVal args As System.Windows.DragEventArgs) Dim directoyName As String = GetDirectorioArrastrado(args) If String.IsNullOrWhiteSpace(directoyName) = False Then Me.textBoxEntraDirectorio.Text = directoyName End If ' Marcar el evento como controlado. args.Handled = True End Sub '----------------------------------- ''' <summary> ''' Obtener el nombre completo del directorio arrastrado, ''' o [Empty], si el dato recibido no es un directorio ''' </summary> ''' <param name="args">objeto [DragEventArgs]</param>" ''' <returns> ''' Una cadena con el nombre completo del directorio arrastrado, ''' o [Empty], si el dato recibido no es un directorio ''' </returns> ''' <remarks> ''' <para> Esta función es la que recoge el objeto que viene en 'GetData' </para> ''' <para> se transforma en una cadena, y se hacen las siguientes comprobaciones </para> ''' <para> - Se mira si es un directorio, y se obtiene su (ruta) nombre completo </para> ''' <para> - Si no, se mira si es un fichero y se obtiene su directorio (ruta) completa </para> ''' <para> - Si todo falla se devuelve un valor [Empty] </para> ''' <para> Nota: Recuerda que estamos arrastrando un icono de una ventana de windows :-) </para> ''' </remarks> Private Function GetDirectorioArrastrado(ByVal args As System.Windows.DragEventArgs) As String '---------------- ' cadena donde dejo el texto arrastrado Dim textoRecibido As String = String.Empty '---------------- ' si se recibe un fichero interceptarlo If args.Data.GetDataPresent(DataFormats.FileDrop, True) Then Dim fileNames() As String = TryCast(args.Data.GetData(DataFormats.FileDrop, True), String()) ' Comprobar si hay un archivo o carpeta. If fileNames.Length = 1 Then ' por razones de diseño solo leo el primer elemento arrastrado textoRecibido = fileNames(0) End If End If '---------------- ' si no se ha recibido nada, mirar si se recibe un texto plano ' si recibe un texto plano interceptarlo If String.IsNullOrWhiteSpace(textoRecibido) = True Then If args.Data.GetDataPresent(DataFormats.Text, True) Then textoRecibido = TryCast(args.Data.GetData(DataFormats.Text, True), String) End If End If '---------------- ' la cadena que devuelve esta función Dim nombreDirectorio As String = Nothing '---------------- ' si se ha recibido un texto If String.IsNullOrWhiteSpace(textoRecibido) = False Then ' mirar si es un directorio y obtener su nombre Dim di As New IO.DirectoryInfo(textoRecibido) di.Refresh() If di.Exists = True Then nombreDirectorio = di.FullName Else ' mirar si es un fichero y entonces extraer el directorio Dim fi As New IO.FileInfo(textoRecibido) fi.Refresh() If fi.Exists = True Then nombreDirectorio = fi.DirectoryName End If End If End If ' devolver [Empty], o le nombre (completo) del directorio Return nombreDirectorio End Function #End Region
© 1997 - - La Güeb de Joaquín | |||||
Joaquín Medina Serrano
|
|||||
|
Codificación | |
Fecha de creación | |
Última actualización | |