Wpf - Drag and Drop el nombre de un directorio

Descripción general

Pequeño apunte que muestra como se usa Drag and Drop, para mostrar en un control el nombre de un directorio

[TOC] Tabla de Contenidos


↑↑↑

Drag and Drop

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


↑↑↑

La propiedad AllowDrop="True"

Para que se activen las operaciones de Arrastar y soltar la propiedad AllowDrop debe tener el valor "True"


↑↑↑

El evento DragEventArgs

El evento DragEventArgs dispone de varias propiedades muy interesantes:

En general permite realizar dos comprobaciones muy importantes:


↑↑↑

El Evento PreviewDragLeave

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


↑↑↑

El Evento PreviewDragOver

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.


↑↑↑

El Evento PreviewDragEnter

Se desencadena cuando el ratón entra en un control en el que Drag and Drop está habilitado. Te da la oportunidad de:


↑↑↑

El evento PreviewDragDrop

Se desencadena cuando soltamos el botón derecho del ratón sobre el control


↑↑↑

El codigo


#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


↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquín Medina Serrano
Ésta página es española

Codificación
Fecha de creación
Última actualización
[HTML5 Desarrollado usando CSS3]