Я создал небольшое тестовое приложение Windows Forms, чтобы опробовать некоторый код перетаскивания. Форма состоит из трех PictureBoxes. Мое намерение состояло в том, чтобы захватить изображение с одного PictureBox, отобразить его как пользовательский курсор во время операции перетаскивания, а затем удалить его на другой целевой объект PictureBox.
Это отлично работает с одной PictureBox на другую, если они находятся в одной и той же форме.
Если я открываю два экземпляра одного и того же приложения и пытаюсь перетащить их между ними, я получаю следующую загадочную ошибку:
Этот удаленный прокси не имеет канала который означает, что сервер имеет нет зарегистрированных каналов сервера, которые прослушивания, или это приложение не имеет подходящий клиентский канал для сервер.
По какой-то причине, однако, он работает, чтобы перетащить на Wordpad (но не MS Word или Paintbrush).
Три PictureBoxes активируют свои события следующим образом:
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);
}
}
Тогда есть четыре события, подобные этому:
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);
}
Любая помощь будет принята с благодарностью!