2010-09-14 26 views
7

Estoy intentando implementar una operación de arrastrar y soltar. Quiero mostrarle a mi usuario una vista de lista con archivos. Cuando el usuario arrastra un archivo y lo deja caer en una carpeta, el contenido debe descargarse y entregarse.Implementar la función de arrastrar y soltar

Estoy usando la interfaz IDataObject, pero mi problema es que el método GetData() es consultado demasiado pronto. Por ejemplo, un arrastre sobre el escritorio (sin ninguna caída) consultará el método GetData() un par de veces. Y cada una de estas llamadas inicia la descarga del archivo:/

Ahora, mi pregunta es: ¿Qué ocurre aquí? ¿Por qué se llama al método GetData() sin ninguna caída? ¿Hay alguna otra forma de implementar las operaciones de arrastre perezoso & en .net?

+0

El problema que tendrá es escuchar el evento de caída en Explorer, que es cuando desea iniciar la descarga. Puede hacer una prueba de concepto arrastrando y soltando sobre otro control en su formulario, que podrá suscribirse al evento drop de. –

+0

Sí, esto podría ayudarme, pero suena mucho más complicado y me obliga a dejarlo solo al explorador. Otros targest, que aceptan filtros normalmente, no podrían obtener los datos. En teoría, el evento drop debería llamar a * IDataObject.GetData() * - y solo debería hacerlo. Entonces puedo entregar los datos (directos o por descarga). Sin embargo, hay llamadas a estas funciones sin una caída involucrada, lo que hace inutilizable este enfoque. – tanascius

+0

¿No hay forma de retrasar la descarga hasta que el receptor realmente solicite ver los bytes? –

Respuesta

1

Tal vez esto podría funcionar para usted ...

En cada aparición de la GetData() hacer esto:

  • usted necesitará algún tipo de temporizador aquí.
  • si su temporizador ya está activo, mátalo.
  • crear e iniciar un nuevo temporizador. Haga que sea 1 seg o determine su duración desde el experimento.
  • en el evento temporizador hacer lo que tiene que hacerse.

Utilizo un procedimiento similar en muchas ocasiones en que se necesita dicha solución.

+0

El problema aquí es que el arrastre podría cancelarse en absoluto. – tanascius

+0

¿Estás diciendo que no hay forma de que puedas hacer una distinción entre arrastrar y soltar completado y cancelar uno? –

+0

Sí, ¿cómo se cancela el temporizador en caso de que se cancele y suelte? – tanascius

1

Creo que se llama a GetData para que el objetivo de caída (potencial) pueda determinar si puede o no aceptar el (los) elemento (s) descartable (s). ¿Has considerado usar una extensión de shell?

+0

Por lo que yo entiendo, [GetDataPresent] (http://msdn.microsoft.com/en- us/library/f0z723wb.aspx) debe llamarse al principio. Aún intentando ... – tanascius