Ho creato una piccola applicazione di test di Windows Form per provare un codice di trascinamento. Il modulo è composto da tre PictureBox. La mia intenzione era quella di catturare un'immagine da un PictureBox, visualizzarlo come un cursore personalizzato durante l'operazione di trascinamento, quindi rilasciarlo su un altro oggetto PictureBox.Trascinamento tra istanze della stessa applicazione Windows Form
Questo funziona bene da un PictureBox a un altro finché sono sullo stesso modulo.
Se apro due istanze della stessa applicazione e tenta di trascinare/drop tra di loro, ottengo il seguente errore criptico:
This remoting proxy has no channel sink which means either the server has no registered server channels that are listening, or this application has no suitable client channel to talk to the server.
Per qualche ragione, però, funziona per trascinare/drop per Wordpad (ma non MS Word o Pennello).
I tre PictureBoxes ottenere i loro eventi agganciati in questo modo:
foreach (Control pbx in this.Controls) {
if (pbx is PictureBox) {
pbx.AllowDrop = true;
pbx.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
pbx.GiveFeedback += new GiveFeedbackEventHandler(pictureBox_GiveFeedback);
pbx.DragEnter += new DragEventHandler(pictureBox_DragEnter);
pbx.DragDrop += new DragEventHandler(pictureBox_DragDrop);
}
}
Poi ci sono i quattro eventi come questo:
void pictureBox_MouseDown(object sender, MouseEventArgs e) {
int width = (sender as PictureBox).Image.Width;
int height = (sender as PictureBox).Image.Height;
Bitmap bmp = new Bitmap(width, height);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage((sender as PictureBox).Image, 0, 0, width, height);
g.Dispose();
cursorCreatedFromControlBitmap = CustomCursors.CreateFormCursor(bmp, transparencyType);
bmp.Dispose();
Cursor.Current = this.cursorCreatedFromControlBitmap;
(sender as PictureBox).DoDragDrop((sender as PictureBox).Image, DragDropEffects.All);
}
void pictureBox_GiveFeedback(object sender, GiveFeedbackEventArgs gfea) {
gfea.UseDefaultCursors = false;
}
void pictureBox_DragEnter(object sender, DragEventArgs dea) {
if ((dea.KeyState & 32) == 32) { // ALT is pressed
dea.Effect = DragDropEffects.Link;
}
else if ((dea.KeyState & 8) == 8) { // CTRL is pressed
dea.Effect = DragDropEffects.Copy;
}
else if ((dea.KeyState & 4) == 4) { // SHIFT is pressed
dea.Effect = DragDropEffects.None;
}
else {
dea.Effect = DragDropEffects.Move;
}
}
void pictureBox_DragDrop(object sender, DragEventArgs dea) {
if (((IDataObject)dea.Data).GetDataPresent(DataFormats.Bitmap))
(sender as PictureBox).Image = (Image)((IDataObject)dea.Data).GetData(DataFormats.Bitmap);
}
Qualsiasi aiuto sarebbe molto apprezzato!
Ottima risposta. Molto bello +1 –
Ciao Michael! Mi piace il tuo approccio. Grazie per la risposta! Questo mi ha infastidito per un bel po 'di tempo e la tua soluzione è una buona soluzione per un problema ricorrente. Tuttavia, ho trovato un'altra soluzione che potrebbe essere migliore (almeno più breve) nel caso di trasferimento di formati di appunti comuni. Quella soluzione è descritta sotto. In ogni caso voglio darti la "risposta accettata" in quanto la tua soluzione è probabilmente più adattabile al caso generale. Si prega di rivedere la mia soluzione di seguito per un modo diverso per risolvere questo problema. - Peder - – Pedery
La tua ricerca è molto interessante ed è probabilmente la soluzione migliore per il tuo caso. Intendo completamente scavare in quell'articolo e sperimentare questa tecnica. È un po 'triste che sia stato necessario un tale sforzo da entrambe le parti per risolvere questo problema. Mi fa rabbrividire ogni volta che ho bisogno di interagire con la shell di .NET, in quanto il matrimonio è tipicamente un evento roccioso. Grazie per il credito e ancora di più per le informazioni aggiuntive su questo argomento. –