2012-07-10 13 views

Respuesta

21

Para la demostración, colocar dos paneles en un formulario y un botón en uno de los paneles:

public Form1() { 
    InitializeComponent(); 

    panel1.AllowDrop = true; 
    panel2.AllowDrop = true; 

    panel1.DragEnter += panel_DragEnter; 
    panel2.DragEnter += panel_DragEnter; 

    panel1.DragDrop += panel_DragDrop; 
    panel2.DragDrop += panel_DragDrop; 

    button1.MouseDown += button1_MouseDown; 
} 

void button1_MouseDown(object sender, MouseEventArgs e) { 
    button1.DoDragDrop(button1, DragDropEffects.Move); 
} 

void panel_DragEnter(object sender, DragEventArgs e) { 
    e.Effect = DragDropEffects.Move; 
} 

void panel_DragDrop(object sender, DragEventArgs e) { 
    ((Button)e.Data.GetData(typeof(Button))).Parent = (Panel)sender; 
} 
0

Este método también funciona para los marcos de grupo, pero los acontecimientos MouseEnter, MouseLeave y MouseUp se debe agregar manualmente :

public frmMain () { 
    InitializeComponent (); 

    pbxMoveIt.BringToFront (); 
    gbx1.AllowDrop = true; 
    gbx2.AllowDrop = true; 
    lblStatus.Text = "GUI Status: Started"; 
    gbx1.MouseEnter += gbx_MouseEnter; 
    gbx1.MouseLeave += gbx_MouseLeave; 
    gbx1.MouseUp += gbx_MouseUp; 
    gbx2.MouseEnter += gbx_MouseEnter; 
    gbx2.MouseLeave += gbx_MouseLeave; 
    gbx2.MouseUp += gbx_MouseUp; 
} 

private void gbx_MouseEnter (object sender, EventArgs e) { 
    // useful code 
    // ... 
} 
private void gbx_MouseLeave (object sender, EventArgs e) { 
    // useful code 
    // ... 
} 
private void gbx_MouseUp (object sender, EventArgs e) { 
    // useful code 
    // ... 
}