2009-07-22 11 views
7

Me gustaría desencadenar el control de destino de arrastre para volver a dibujarse (mediante invalidar o actualizar) durante los eventos DragEnter y DragLeave. El código es algo como:Volver a dibujar durante la operación de arrastrar y soltar

protected override void OnDragEnter (DragEventArgs drgargs) 
{ 
    //-- Set a property that affects drawing of control, then redraw 
    this.MyProperty = true; 
    this.Refresh(); //-- Does nothing???  
} 

protected override void OnDragLeave (EventArgs e) 
{ 
    //-- Set a property that affects drawing of control, then redraw 
    this.MyProperty = false; 
    this.Refresh(); //-- Does nothing???  
} 

En realidad, no volver a dibujar el control, el método OnPaint no es llamado por el Refresh() dentro de estos eventos. ¿Hay alguna manera de hacer esto? No debo entender algo aquí.

ACTUALIZACIÓN: la respuesta proporcionada por jasonh en realidad no funciona. Al usar Invalidate() o Invalidate (rect) el control no se actualiza. Se trata de llamadas durante una acción de arrastrar y soltar. ¿Alguna otra idea? ¿Puede desencadenar un redibujado de un control durante arrastrando y soltando? ¡Gracias!

ACTUALIZACIÓN 2: que creó un proyecto de ejemplo y no podía conseguir que esto no trabajo. Suspiro ... Finalmente lo rastreé hasta encontrar algún código en el OnPaint que causaba el problema. Entonces, esto resultó ser que más de mí no entendía cómo funcionaba el depurador (nunca llegó a los puntos de interrupción en OnPaint ... aún no sé por qué). Invalidate(), Refresh() ambos funcionan. JasonH obtiene la respuesta, ya que en última instancia era correcta y también mostró cómo invalidar solo una parte de un control ... No sabía de eso.

¡Gracias por toda su ayuda!

+0

Supongo que no has configurado AllowDrop como verdadero. – jasonh

+0

Sí, AllowDrop está establecido en verdadero. El arrastrar y soltar está sucediendo. Solo el redibujado del control no es (OnPaint no se invoca después de Invalidate() o Refresh()). –

Respuesta

4

Llame al this.Invalidate() para obtener el Formulario/Control para que vuelva a dibujarse. Si conoce la región específica, llame a uno de los métodos sobrecargados para especificar qué invalidar. Por ejemplo:

Rectangle toInvalidate = new Rectangle(drgargs.X - 50, drgargs.Y - 50, 50, 50); 
this.Invalidate(toInvalidate); 

Eso anularía un área de 50 píxeles alrededor del área donde se encuentra el objetivo de arrastre.

+2

Esto no funcionó. La pregunta era específicamente sobre hacer esto durante un evento de arrastrar y soltar. Si funciona para usted, debe haber algo que estoy haciendo mal ... ... –

+1

No estoy seguro de por qué estoy siendo downvoted, ya que Invalidate hace exactamente lo que se supone que debe hacer. – jasonh

+0

Asegúrese de que UserControl tenga la propiedad AllowDrop establecida en verdadero.He probado esto en un proyecto simple con una cadena que se dibuja en el control y cambia de color (con lo que estoy probando) según si el usuario está arrastrando el control o no. ¿Puedes publicar un ejemplo de un proyecto que no funciona para que pueda ayudarte a solucionarlo? – jasonh

2

Hay tres métodos aparentemente aplicables aquí:

Control.Invalidate() - marca el mando (región o rectángulo) como en la necesidad de volver a pintar, pero no obliga a volver a pintar, el repintado se activa cuando todo lo demás tiene sido atendidos y la aplicación queda inactiva.

Control.Update() - hace que el control se vuelva a pintar inmediatamente si alguna parte ha sido invalidada.

Control.Refresh() - hace que el control se invalide, y luego actualiza (inmediatamente vuelve a pintar).

Por lo tanto, Refresh() es el enfoque correcto. Lo que haría es establecer un punto de interrupción en la llamada al método de actualización y ver si/cuando se está recibiendo.

+0

Está siendo golpeado. Se ejecuta, pero en realidad no hace que se invoque OnPaint. –