【发布时间】:2010-11-15 04:00:49
【问题描述】:
我创建了一个小型 Windows 窗体测试应用程序来尝试一些拖放代码。该表单由三个图片框组成。我的意图是从一个 PictureBox 中抓取一张图片,在拖动操作期间将其显示为自定义光标,然后将其放到另一个 PictureBox 目标上。
从一个 PictureBox 到另一个 只要它们在同一个表单上,这都可以正常工作。
如果我打开同一应用程序的两个实例并尝试在它们之间拖放,我会收到以下神秘错误:
此远程代理没有通道 sink 这意味着服务器有 没有注册的服务器频道 听,或者这个应用程序没有 合适的客户渠道与之交谈 服务器。
但是,出于某种原因,它确实可以拖放到写字板(但不是 MS Word 或 Paintbrush)。
三个 PictureBox 的事件如下所示:
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);
}
任何帮助将不胜感激!
【问题讨论】:
标签: c# winforms drag-and-drop