Compartir a través de


Información general sobre la función de arrastrar y colocar

En este tema se proporciona información general sobre la compatibilidad con la operación de arrastrar y colocar en las aplicaciones de Windows Presentation Foundation (WPF). Normalmente, arrastrar y colocar hace referencia a un método de transferencia de datos en el que se utiliza un mouse (u otro dispositivo señalador) para seleccionar uno o más objetos, arrastrarlos hasta el destino de colocación de la user interface (UI) que se desee y colocarlos.

Este tema contiene las secciones siguientes.

  • Compatibilidad con arrastrar y colocar en WPF
  • Transferencia de datos
  • Eventos de arrastrar y colocar
  • Implementar la operación de arrastrar y colocar
  • Ejemplo de una operación de arrastrar y colocar
  • Temas relacionados

Compatibilidad con arrastrar y colocar en WPF

En las operaciones de arrastrar y colocar suelen participar dos partes: un origen de arrastre, donde se origina el objeto que se arrastra, y un destino de colocación, que recibe el objeto al colocarlo. El origen de arrastre y el destino de colocación pueden ser elementos de interfaz de usuario de la misma aplicación u otra distinta.

El tipo y el número de objetos que se pueden manipular con arrastrar y colocar son completamente arbitrarios. Por ejemplo, archivos, carpetas y selecciones de contenido son algunos de los objetos más comunes que se manipulan mediante las operaciones de arrastrar y colocar.

Las acciones concretas que se realizan durante una operación de arrastrar y colocar son específicas de la aplicación y, a menudo, vienen determinadas por el contexto. Por ejemplo, al arrastrar una selección de archivos desde una carpeta hasta otra dentro del mismo dispositivo de almacenamiento, de manera predeterminada los archivos se mueven; en cambio, al arrastrar archivos desde un recurso compartido Universal Naming Convention (UNC) hasta una carpeta local, de manera predeterminada los archivos se copian.

Las capacidades de arrastrar y colocar que proporciona WPF se han diseñado para que sean extremadamente flexibles y personalizables para admitir gran variedad de escenarios de arrastrar y colocar. La función de arrastrar y colocar permite manipular objetos dentro de una única aplicación o entre aplicaciones diferentes. Arrastrar y colocar entre aplicaciones de WPF y otras aplicaciones de Windows también es totalmente compatible.

En WPF, cualquier UIElement o ContentElement puede participar en una operación de arrastrar y colocar. Los eventos y métodos necesarios para las operaciones de arrastrar y colocar se definen en la clase DragDrop. Las clases UIElement y ContentElement contienen alias de los eventos adjuntos DragDrop para que los eventos aparezcan en la lista de miembros de clase cuando un UIElement o ContentElement se herede como elemento base. Los controladores de eventos que se adjuntan a estos eventos lo hacen al evento adjunto DragDrop subyacente y reciben la misma instancia de datos del evento. Para obtener más información, vea el evento UIElement.Drop.

Nota de seguridadNota sobre la seguridad

La función de arrastrar y colocar de OLE no funciona en la zona de Internet.

Transferencia de datos

Arrastrar y colocar forma parte del área más general de la transferencia de datos. La transferencia de datos incluye las operaciones de arrastrar y colocar y de copiar y pegar. Una operación de arrastrar y colocar es análoga a una operación de copiar y pegar o de cortar y pegar que se utiliza para transferir datos de una aplicación u objeto a otro utilizando el Portapapeles del sistema. Ambos tipos de operaciones requieren:

  • Un objeto de origen que proporcione los datos.

  • Una manera de almacenar temporalmente los datos transferidos.

  • Un objeto de destino que reciba los datos.

En una operación de copiar y pegar, el Portapapeles del sistema se utiliza para almacenar temporalmente los datos transferidos; en una operación de arrastrar y colocar se utiliza un DataObject para almacenar los datos. Conceptualmente, un objeto de datos consta de uno o varios pares de Object que contiene los datos reales, y un identificador de formato de datos correspondiente.

El origen de arrastre inicia una operación de arrastrar y colocar llamando al método DragDrop.DoDragDrop estático y pasándole los datos transferidos. El método DoDragDrop incluirá automáticamente los datos en un DataObject si es necesario. Para tener mayor control sobre el formato de datos, puede incluir los datos en un DataObject antes de pasarlos al método DoDragDrop. El destino de colocación es responsable de extraer los datos del DataObject. Para obtener más información sobre cómo trabajar con objetos de datos, vea Datos y objetos de datos.

El origen y destino de una operación de arrastrar y colocar son elementos de interfaz de usuario; sin embargo, los datos que se transfieren realmente no suelen tener una representación visual. Puede escribir código para proporcionar una representación visual de los datos que se arrastran, como ocurre al arrastrar archivos en el Explorador de Windows. De forma predeterminada, se proporciona información al usuario cambiando el cursor para representar el efecto que tendrá sobre los datos la operación de arrastrar y colocar, por ejemplo, si los datos se van a mover o copiar.

Efectos de arrastrar y colocar

Las operaciones de arrastrar y colocar pueden tener distintos efectos sobre los datos transferidos. Por ejemplo, puede copiar los datos o puede moverlos. WPF define una enumeración DragDropEffects que puede utilizar para especificar el efecto de una operación de arrastrar y colocar. En el origen de arrastre, puede especificar los efectos que el origen permitirá en el método DoDragDrop. En el destino de colocación, puede especificar el efecto que desea para el destino en la propiedad Effects de la clase DragEventArgs. Cuando el destino de colocación especifica el efecto deseado en el evento DragOver, dicha información se devuelve al origen de arrastre en el evento GiveFeedback. El origen de arrastre utiliza esta información para indicar al usuario qué efecto pretende tener el destino de colocación sobre los datos. Al colocar los datos, el destino de colocación especifica su efecto real en el evento Drop. Esa información se pasa al origen de arrastre como el valor devuelto del método DoDragDrop. Si el destino de colocación devuelve un efecto que no figura en la lista de orígenes de arrastre de allowedEffects, la operación de arrastrar y colocar se cancelará sin que se produzca ninguna transferencia de datos.

Es importante recordar que en WPF, los valores de DragDropEffects se utilizan únicamente para proporcionar comunicación entre el origen de arrastre y el destino de colocación respecto a los efectos de la operación de arrastrar y colocar. El efecto real de la operación de arrastrar y colocar depende de que escriba el código apropiado en la aplicación.

Por ejemplo, el destino de colocación podría especificar que el efecto de colocar datos en él sea mover los datos. Sin embargo, para mover los datos, se deben agregar al elemento de destino y quitar del elemento de origen. El elemento de origen podría indicar que permite mover los datos, pero si no se proporciona el código para quitar los datos del elemento de origen, el resultado final será que los datos se copian y no se mueven.

Eventos de arrastrar y colocar

Las operaciones de arrastrar y colocar admiten un modelo basado en eventos. Tanto el origen de arrastre como el destino de colocación utilizan un conjunto estándar de eventos para controlar las operaciones de arrastrar y colocar. En las tablas siguientes se resumen los eventos de arrastrar y colocar estándar. Son eventos adjuntos en la clase DragDrop. Para obtener más información sobre los eventos adjuntos, vea Información general sobre eventos adjuntos.

Eventos del origen de arrastre

Evento

Resumen

[ E:System.Windows.DragDrop.GiveFeedback ]

Este evento se produce continuamente durante una operación de arrastrar y colocar, y permite al origen de colocación proporcionar información al usuario. Esta información normalmente se proporciona cambiando la apariencia del puntero del mouse para indicar los efectos que permite el destino de colocación. Se trata de un evento de propagación.

[ E:System.Windows.DragDrop.QueryContinueDrag ]

Este evento se produce cuando hay un cambio en el estado del teclado o del botón del mouse durante una operación de arrastrar y colocar, y permite al origen de colocación cancelar la operación de arrastrar y colocar en función de ese estado. Se trata de un evento de propagación.

[ E:System.Windows.DragDrop.PreviewGiveFeedback ]

Versión de túnel de GiveFeedback.

[ E:System.Windows.DragDrop.PreviewQueryContinueDrag ]

Versión de tunelización de QueryContinueDrag.

Eventos del destino de colocación

Evento

Resumen

[ E:System.Windows.DragDrop.DragEnter ]

Este evento se produce cuando se arrastra un objeto a los límites del destino de colocación. Se trata de un evento de propagación.

[ E:System.Windows.DragDrop.DragLeave ]

Este evento se produce cuando se arrastra un objeto fuera de los límites del destino de colocación. Se trata de un evento de propagación.

[ E:System.Windows.DragDrop.DragOver ]

Este evento se produce continuamente mientras se arrastra (mueve) un objeto dentro del límite del destino de colocación. Se trata de un evento de propagación.

[ E:System.Windows.DragDrop.Drop ]

Este evento se produce cuando un objeto se coloca en el destino de colocación. Se trata de un evento de propagación.

[ E:System.Windows.DragDrop.PreviewDragEnter ]

Versión de tunelización de DragEnter.

[ E:System.Windows.DragDrop.PreviewDragLeave ]

Versión de tunelización de DragLeave.

[ E:System.Windows.DragDrop.PreviewDragOver ]

Versión de tunelización de DragOver.

[ E:System.Windows.DragDrop.PreviewDrop ]

Versión de tunelización de Drop.

Para controlar los eventos de arrastrar y colocar de las instancias de un objeto, agregue controladores de los eventos enumerados en las tablas anteriores. Para controlar los eventos de arrastrar y colocar en el nivel de clase, invalide los métodos On*Event y On*PreviewEvent virtuales correspondientes. Para obtener más información, vea Control de clases de los eventos enrutados por las clases base de los controles.

Implementar la operación de arrastrar y colocar

Un elemento de interfaz de usuario puede ser un origen de arrastre, un destino de colocación, o ambos. Para implementar una operación de arrastrar y colocar básica, escriba código para iniciar la operación de arrastrar y colocar y procesar los datos colocados. Puede mejorar la experiencia de arrastrar y colocar controlando eventos de arrastrar y colocar opcionales.

Para implementar una operación de arrastrar y colocar básica, complete las siguientes tareas:

  • Identifique el elemento que será el origen de arrastre. Un origen de arrastre puede ser un UIElement o un ContentElement.

  • Cree un controlador de eventos en el origen de arrastre que iniciará la operación de arrastrar y colocar. El evento es normalmente el evento MouseMove.

  • En el controlador de eventos del origen de arrastre, llame al método DoDragDrop para iniciar la operación de arrastrar y colocar. En la llamada a DoDragDrop, especifique el origen de arrastre, los datos que se van a transferir y los efectos permitidos.

  • Identifique el elemento que será el destino de colocación. Un destino de colocación puede ser un UIElement o un ContentElement.

  • En el destino de colocación, establezca la propiedad AllowDrop en true.

  • En el destino de colocación, cree un controlador de eventos Drop para procesar los datos colocados.

  • En el controlador de eventos Drop, extraiga los datos de DragEventArgs mediante los métodos GetDataPresent y GetData.

  • En el controlador de eventos Drop, utilice los datos para realizar la operación de arrastrar y colocar que desee.

Puede mejorar la implementación de arrastrar y colocar creando un DataObject personalizado y controlando eventos de origen de arrastre y destino de colocación opcionales, como se muestra en las siguientes tareas:

  • Para transferir datos personalizados o varios elementos de datos, cree un DataObject para pasarlo al método DoDragDrop.

  • Para realizar acciones adicionales durante una operación de arrastrar, controle los eventos DragEnter, DragEnter y DragEnter en el destino de colocación.

  • Para cambiar la apariencia del puntero del mouse, controle el evento GiveFeedback en el origen de arrastre.

  • Para cambiar el modo de cancelar la operación de arrastrar y colocar, controle el evento QueryContinueDrag en el origen de arrastre.

Ejemplo de una operación de arrastrar y colocar

Esta sección describe cómo implementar una operación de arrastrar y colocar para un elemento Ellipse. El elemento Ellipse es tanto un origen de arrastre como un destino de colocación. Los datos transferidos son la representación de cadena de la propiedad Fill de la elipse. El siguiente código XAML muestra el elemento Ellipse y los eventos relacionados con la operación de arrastrar y colocar que controla. Para conocer todos los pasos necesarios para implementar una operación de arrastrar y colocar, vea Tutorial: Habilitar la técnica de arrastrar y colocar en un control de usuario.

Habilitar un elemento para que sea un origen de arrastre

Un objeto que es un origen de arrastre es responsable de:

  • Identificar cuándo ocurre un arrastre.

  • Iniciar la operación de arrastrar y colocar.

  • Identificar los datos que se van a transferir.

  • Especificar los efectos que la operación de arrastrar y colocar puede tener sobre los datos transferidos.

El origen de arrastre también puede proporcionar información al usuario relativa a las acciones permitidas (mover, copiar, ninguna) y puede cancelar la operación de arrastrar y colocar de acuerdo con los datos adicionales proporcionados por el usuario, por ejemplo presionar la tecla ESC durante el arrastre.

Es responsabilidad de la aplicación determinar cuándo se produce un arrastre y, a continuación, iniciar la operación de arrastrar y colocar llamando al método DoDragDrop. Normalmente, esto ocurre cuando se produce un evento MouseMove sobre el elemento que se desea arrastrar mientras se presiona un botón del mouse. En el ejemplo siguiente se muestra cómo iniciar una operación de arrastrar y colocar desde el controlador de eventos MouseMove de un elemento Ellipse para convertirlo en un origen de arrastre. Los datos transferidos son la representación de cadena de la propiedad Fill de la elipse.

Dentro del controlador de eventos MouseMove, llame al método DoDragDrop para iniciar la operación de arrastrar y colocar. El método DoDragDrop toma tres parámetros:

  • dragSource: una referencia al objeto de dependencia que es el origen de los datos transferidos; normalmente es el origen del evento MouseMove.

  • data: un objeto que contiene los datos transferidos, incluido en un DataObject.

  • allowedEffects: uno de los valores de la enumeración DragDropEffects que especifica los efectos permitidos de la operación de arrastrar y colocar.

Cualquier objeto serializable puede pasarse en el parámetro data. Si los datos no están ya incluidos en un DataObject, se incluirán automáticamente en un nuevo DataObject. Para pasar varios elementos de datos, debe crear el DataObject usted mismo, y pasarlo al método DoDragDrop. Para obtener más información, vea Datos y objetos de datos.

El parámetro allowedEffects se utiliza para especificar que permitirá el origen de arrastre que haga el destino de colocación con los datos transferidos. Los valores habituales de un origen de arrastre son Copy, Move y All.

NotaNota

El destino de colocación también puede especificar qué efectos desea tener en respuesta a los datos colocados.Por ejemplo, si el destino de colocación no reconoce el tipo de datos que va a colocar, puede rechazar los datos estableciendo sus efectos permitidos en None.Esto normalmente lo hace en su controlador de eventos DragOver.

Un origen de arrastre puede controlar opcionalmente los eventos GiveFeedback y QueryContinueDrag. Estos eventos tienen controladores predeterminados que se utilizan a menos que marque los eventos como controlados. Normalmente omitirá estos eventos a menos que tenga la necesidad específica de cambiar su comportamiento predeterminado.

El evento GiveFeedback se genera continuamente mientras se arrastra el origen de arrastre. El controlador predeterminado de este evento comprueba si el origen de arrastre está sobre un destino de colocación válido. Si es así, comprueba los efectos permitidos del destino de colocación. A continuación, proporciona información al usuario final sobre los efectos de colocación permitidos. Esto suele hacerse cambiando el cursor del mouse por un cursor de copiar, mover o prohibición de colocar. Solo debe controlar este evento si necesita utilizar cursores personalizados para proporcionar información al usuario. Si controla este evento, asegúrese de marcarlo como controlado para que el controlador predeterminado no invalide el controlador.

El evento QueryContinueDrag se genera continuamente mientras se arrastra el origen de arrastre. Puede controlar este evento para determinar qué acción finaliza la operación de arrastrar y colocar en función del estado de las teclas ESC, MAYÚS, CTRL y ALT, así como el estado de los botones del mouse. El controlador predeterminado de este evento cancela la operación de arrastrar y colocar si se presiona la tecla ESC, y coloca los datos si se suelta el botón del mouse.

Nota de precauciónPrecaución

Estos eventos se generan continuamente durante la operación de arrastrar y colocar.Por tanto, debe evitar las tareas con un uso intensivo de recursos en los controladores de eventos.Por ejemplo, use un cursor almacenado en caché en lugar de crear un nuevo cursor cada vez que se genera el evento GiveFeedback.

Habilitar un elemento para que sea un destino de colocación

Un objeto que es un destino de colocación es responsable de:

  • Especificar que es un destino de colocación válido.

  • Responder al origen de arrastre cuando se arrastra sobre el destino.

  • Comprobar que los datos transferidos tienen un formato que puede recibir.

  • Procesar los datos colocados.

Para especificar que un elemento es un destino de colocación, establezca su propiedad AllowDrop en true. Los eventos del destino de colocación se generarán en el elemento para que pueda controlarlos. Durante una operación de arrastrar y colocar, se produce la siguiente secuencia de eventos en el destino de colocación:

  1. [ E:System.Windows.DragDrop.DragEnter ]

  2. [ E:System.Windows.DragDrop.DragOver ]

  3. DragLeave o Drop

El evento DragEnter se produce cuando se arrastran los datos en el límite del destino de colocación. Normalmente este evento se controla para proporcionar una vista previa de los efectos de la operación de arrastrar y colocar, si es adecuado para la aplicación. No establezca la propiedad DragEventArgs.Effects en el evento DragEnter, porque se sobrescribirá en el evento DragOver.

En el siguiente ejemplo se muestra el controlador de eventos DragEnter de un elemento Ellipse. Este código muestra una vista previa de los efectos de la operación de arrastrar y colocar guardando el pincel Fill actual. A continuación, se utiliza el método GetDataPresent para comprobar si el DataObject que se está arrastrando sobre la elipse contiene datos de cadena que se pueden convertir en un Brush. Si es así, los datos se extraen mediante el método GetData. A continuación, se convierte en un Brush y se aplica a la elipse. El cambio se revierte en el controlador de eventos DragLeave. Si los datos no se pueden convertir en un Brush, no se realiza ninguna acción.

El evento DragOver se produce continuamente mientras los datos se arrastran sobre el destino de colocación. Este evento se empareja con el evento GiveFeedback en el origen de arrastre. En el controlador de eventos DragOver, normalmente se utilizan los métodos GetDataPresent y GetData para comprobar si los datos transferidos tienen un formato que el destino de colocación puede procesar. También puede comprobar si se presionó alguna tecla modificadora, lo que indica normalmente si el usuario desea mover o copiar. Después de realizar estas comprobaciones, establezca la propiedad DragEventArgs.Effects para notificar al origen de arrastre qué efecto tendrá la colocación de los datos. El origen de arrastre recibe esta información en los argumentos del evento GiveFeedback y puede establecer un cursor apropiado para proporcionar información al usuario.

En el siguiente ejemplo se muestra el controlador de eventos DragOver de un elemento Ellipse. Este código comprueba si el DataObject que se está arrastrando sobre la elipse contiene datos de cadena que se pueden convertir en un Brush. Si es así, establece la propiedad DragEventArgs.Effects en Copy. Esto indica al origen de arrastre que los datos se pueden copiar en la elipse. Si los datos no se pueden convertir en un Brush, la propiedad DragEventArgs.Effects se establece en None. Esto indica al origen de arrastre que la elipse no es un destino de colocación válido para los datos.

El evento DragLeave se produce cuando los datos se arrastran fuera de los límites del destino sin que sean colocados. Controle este evento para deshacer todo lo que hizo en el controlador de eventos DragEnter.

En el siguiente ejemplo se muestra el controlador de eventos DragLeave de un elemento Ellipse. Este código deshace la vista previa efectuada en el controlador de eventos DragEnter aplicando el Brush guardado a la elipse.

El evento Drop se produce cuando se colocan los datos sobre el destino de colocación; de forma predeterminada, esto ocurre cuando se libera el botón del mouse. En el controlador de eventos Drop, use el método GetData para extraer los datos transferidos del DataObject y realizar cualquier procesamiento de datos que requiera la aplicación. El evento Drop finaliza la operación de arrastrar y colocar.

En el siguiente ejemplo se muestra el controlador de eventos Drop de un elemento Ellipse. Este código aplica los efectos de la operación de arrastrar y colocar, y es similar al código del controlador de eventos DragEnter. Comprueba si el DataObject que se está arrastrando sobre la elipse contiene datos de cadena que se pueden convertir en un Brush. Si es el caso, Brush se aplica a la elipse. Si los datos no se pueden convertir en un Brush, no se realiza ninguna acción.

Vea también

Referencia

Clipboard

Otros recursos

Tutorial: Habilitar la técnica de arrastrar y colocar en un control de usuario

Temas "Cómo..." de arrastrar y colocar

Arrastrar y colocar

Historial de cambios

Fecha

Historial

Motivo

1 de abril de 2011

Tema actualizado.

Comentarios de los clientes.