2010-10-06 6 views
10

Estoy creando una aplicación en la que necesito para generar controles creados dinámicamente decir cuadro de texto o la etiqueta etc.Cómo permitir al usuario arrastrar un control creado de forma dinámica en el lugar de su elección

Ahora lo que ese usuario pueda reubicar ese cuadro de texto a su ubicación deseada. Como lo hacemos en Visual Studio. Una forma es obtener una nueva ubicación obteniendo valores de él usando el cuadro de texto. Pero quiero que la interfaz de usuario sea fácil.

podemos tener esa funcionalidad en winforms

+1

Sí, pero tendrá que trabajar duro en ello. – SLaks

+0

@SLaks: ¿Puede dirigirme un poco? Puedo dar todo el tiempo que sea necesario. Resolví este problema en mi trabajo, pero allí convencimos a nuestro cliente de lo imposible. Pero sé que es posible. Así que quiero hacerlo en mi casa. Por favor, hágame saber por dónde empezar. –

Respuesta

20

He creado un formulario simple que muestra cómo mover el control arrastrando el control. El ejemplo supone que hay un botón llamado button1 en el formulario adjunto al controlador de eventos relevante.

private Control activeControl; 
private Point previousLocation; 

private void button1_Click(object sender, EventArgs e) 
{ 
    var textbox = new TextBox(); 
    textbox.Location = new Point(50, 50); 
    textbox.MouseDown += new MouseEventHandler(textbox_MouseDown); 
    textbox.MouseMove += new MouseEventHandler(textbox_MouseMove); 
    textbox.MouseUp += new MouseEventHandler(textbox_MouseUp); 

    this.Controls.Add(textbox); 
} 

void textbox_MouseDown(object sender, MouseEventArgs e) 
{ 
    activeControl = sender as Control; 
    previousLocation = e.Location; 
    Cursor = Cursors.Hand; 
} 

void textbox_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (activeControl == null || activeControl != sender) 
     return; 

    var location = activeControl.Location; 
    location.Offset(e.Location.X - previousLocation.X, e.Location.Y - previousLocation.Y); 
    activeControl.Location = location; 
} 

void textbox_MouseUp(object sender, MouseEventArgs e) 
{ 
    activeControl = null; 
    Cursor = Cursors.Default; 
} 
+1

Aquí está el video que creé después de implementar este http://www.youtube.com/watch?v=itdFYe7La-Y –

1

Puede llamar DoDragDrop con un objeto de datos que contiene o que representa el control para comenzar una operación de arrastrar y soltar &, y luego manejar el evento del contenedor DragDrop y mueva el control.

Si desea ver el control, ya que es arrastrado, puede hacer una transparente (manejar WM_NCHITTEST) forma bajo el ratón que muestra el control (llamar DrawToBitmap), o no utilizar arrastrar & caída en absoluto y en lugar de manejar los eventos del ratón y rastrear el estado manualmente.

Si desea combinaciones de estilos de Visual Studio, puede comparar los límites del control con otros controles, crear un conjunto de líneas para dibujar y dibujarlas en un evento de pintura.

+0

Puedo ver en los eventos Panel y Control de botones. No tienen el evento/propiedad DoDragDrop. ¿Tengo que AllowDrop en verdadero? –

+0

Sí; necesita establecer 'AllowDrop' en el contenedor. 'DoDragDrop' es un método al que debe llamar MouseMove poco después de MouseDown si el mouse se movió fuera de' SystemInformation.DragSize'. – SLaks

+0

Vea el ejemplo aquí: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop.aspx – SLaks

Cuestiones relacionadas