Tôi đã tạo một ứng dụng thử nghiệm Biểu mẫu Windows nhỏ để thử một số mã kéo/thả. Biểu mẫu bao gồm ba PictureBox. Ý định của tôi là lấy một hình ảnh từ một PictureBox, hiển thị nó như một con trỏ tùy chỉnh trong quá trình kéo, sau đó thả nó vào một mục tiêu PictureBox khác.Kéo và thả giữa các trường hợp của cùng một Ứng dụng Biểu mẫu Windows
Tính năng này hoạt động tốt từ một PictureBox sang một PictureBox khác miễn là chúng ở trên cùng một hình thức.
Nếu tôi mở hai trường hợp của cùng một ứng dụng và cố gắng để kéo/thả giữa chúng, tôi nhận được báo lỗi khó hiểu sau:
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.
Đối với một số lý do, tuy nhiên, nó không làm việc để kéo/thả để Wordpad (nhưng không phải MS Word hoặc Paintbrush).
Ba PictureBoxes nhận các sự kiện của họ nối như thế này:
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);
}
}
Sau đó, có bốn sự kiện như thế này:
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);
}
Mọi trợ giúp sẽ được đánh giá cao!
Câu trả lời hay. Rất tuyệt. +1 –
Xin chào Michael! Tôi thích cách tiếp cận của bạn. Cảm ơn câu trả lời! Điều này đã làm phiền tôi một thời gian và giải pháp của bạn là một giải pháp tốt cho một vấn đề định kỳ. Tuy nhiên, tôi đã tìm thấy một giải pháp mà có thể tốt hơn (ít nhất là ngắn hơn) trong trường hợp trasfering định dạng clipboard phổ biến. Giải pháp đó được mô tả dưới đây. Trong mọi trường hợp, tôi muốn cung cấp cho bạn câu trả lời "chấp nhận câu trả lời" vì giải pháp của bạn có thể dễ chấp nhận hơn đối với trường hợp chung. Vui lòng xem lại giải pháp của tôi bên dưới để biết cách khác để giải quyết vấn đề này. - Peder - – Pedery
Tìm thấy của bạn rất thú vị và có lẽ là giải pháp tốt nhất cho trường hợp của bạn. Tôi hoàn toàn có ý định đào sâu vào bài viết đó và thử nghiệm với kỹ thuật này. Đó là một chút buồn rằng nỗ lực đó là cần thiết trên cả hai bộ phận của chúng tôi để giải quyết điều này. Tôi cringe bất cứ lúc nào tôi cần phải tương tác với vỏ từ .NET như hôn nhân thường là một trong những đá. Cảm ơn tín dụng và thậm chí nhiều hơn cho các thông tin bổ sung về chủ đề này. –