2009-12-11 7 views
21

Arrastrar pasa de "origen" a "destino". Cuando la fuente llama a DoDragDrop() con allowedEffects como DragDropEffects.Copy, entonces puedo cancelar el drop configurando Effects = DragDropEffects.None en el destino (en el evento DragOver).¿Por qué se permite la eliminación incluso si se establece Effects = DragDropEffects.None?

Pero la misma situación falla cuando configuro mis allowedEffects como DragDropEffects.Move.

para reproducir la situación, descarga la muestra de http://jaimersamples.members.winisp.net/samples/dragdrop/drag.zip

Cambio línea .. (a DragDropEffects.Move)

DragDrop.DoDragDrop(this.DragSource, data, DragDropEffects.Copy); 

Agregar línea ..

void Window1_DragOver(object sender, DragEventArgs args) 
{ 
    args.Effects = DragDropEffects.None; 

Y también en comentario todo, DragSource_GiveFeedback ..

void DragSource_GiveFeedback(object sender, GiveFeedbackEventArgs e) 
{ 
    //System.Diagnostics.Debug.WriteLine("DragSource_GiveFeedback " + e.Effects.ToString()); 

¿Hay algún tipo de error en el marco, o simplemente no puedo ver algo obvio?

+1

Tengo problemas para reproducir su problema con la muestra. Sin modificar, la muestra no me permite soltar el cuadro rojo en el lienzo de destino. Además, todas las instancias de DragDropEffects. * Ya están configuradas en .Move, por lo que no estoy seguro de qué línea de código debe modificarse. Por lo que vale, los cambié a DragDropEffects.Copy y aún no podía colocar el artículo en el lienzo de destino. –

+0

No puedo tomar capturas de pantalla para mostrar el efecto deseado que deseo. El cursor del mouse no está incluido en las capturas de pantalla, pero volveré a formular mi pregunta. La muestra no implementa la caída del cuadro rojo, simplemente comienza la acción de arrastre. Lo que quiero es que el cursor del mouse siempre indique si se permite o no una caída. Está funcionando cuando invoco DoDragDrop() con DragDropEffects.Copy y establezco args.Effects = DragDropEffects.None en Window1_DragOver. Pero no funciona cuando llamo a DoDragDrop() con DragDropEffects.Move. – Trainee4Life

+0

¿No deberías establecer el efecto durante la retroalimentación? – leppie

Respuesta

53

Después de revisar nuevamente tus comentarios y tu código, con un poco de esfuerzo pude entender y reproducir el problema del que estás hablando.

lo que se pierde es la línea:

e.Handled = true; 

En su caso Window1_DragOver. Añádalo y funcionará igual para DragDropEffects.Move y DragDropEffects.Copy.

Por qué funcionó para DragDropEffects.Copy sin establecer e.Handled en primer lugar, es una incógnita. Las condiciones indocumentadas conducen a un comportamiento no documentado.

Voy a recomendar encarecidamente que la próxima vez que publique una muestra de código que contenga código posible mínimo para reproducir el problema. Me disculpo por la confusión original, pero sin embargo fue muy difícil averiguar qué estaba pasando en esta.

+0

1. Hablando del alcance de la ventana completa, es simplemente una verificación para cancelar el arrastre si el mouse lo arrastra fuera de la ventana. 2. Mi pregunta dice específicamente que todo el GiveFeedback debe ser comentado. 3. Entiendo que es el objetivo de soltar que especifica si se aceptan los datos o no. El destino de colocación utiliza su evento DragOver para especificar si se acepta o no la eliminación configurando args.Effects = DragDropEffects.None. También puede establecer los efectos Copiar o Mover, si ese es el caso. 4. DragSource todavía puede especificar los efectos permitidos en la llamada DragDrop.DoDragDrop(). – Trainee4Life

+0

5. El código no se está utilizando en producción. Fue una de las muestras que estudié cuando creé el marco de arrastrar y soltar en nuestra aplicación. – Trainee4Life

+0

Por favor lea nuevamente la pregunta, si puede reproducir lo que digo, entonces estaría en una mejor posición para responder. – Trainee4Life

1

Creo que la pregunta fue respondida muy por encima, pero sólo pensé que se trataba de una valiosa lección que aprendí cuando se hace arrastrar y soltar ...

El DragDropEffect inicial que se pasa al método DoDragDrop deben ser considerados como una sugerencia (o un deseo) para qué operación se debe realizar. Si recuerdo correctamente, ese método devuelve el efecto real que el objetivo realizó si la función de arrastrar y soltar fue realmente exitosa (y no cancelada).

Esto crea un protocolo de comunicación simple entre el origen y el destino y es principalmente útil para casos en los que existen varios objetivos potenciales para el arrastre. Te permite distinguir lo que realmente sucedió. Esto es particularmente útil para pensar porque podría estar interactuando con un componente que ni siquiera conoce o espera. Si se tiene esto en cuenta, a veces se pueden obtener beneficios sorprendentes donde el arrastre y la colocación se vuelven más útiles de lo que se había planeado originalmente, porque de repente otros componentes pueden interoperar sin ninguna otra codificación explícita.

Habiendo dicho esto, me imagino que tiene sentido para el.net framework para tratar las operaciones de copiar y mover de forma diferente por defecto porque una operación es constructiva y la otra es destructiva. Creo que están tratando de protegerse de operaciones destructivas no deseadas sin que se manejen de forma explícita. No estoy seguro de esto, pero solo un pensamiento :)

Cuestiones relacionadas