我无法弄清楚为什么尝试将文本从标准Label拖到记事本(或任何其他控件接受文本)不起作用。我查看了文档和示例,但我没有看到问题。光标仍然是一个圆圈,其中有一条直线,如果我注册了一个FeedBack回调,则该事件始终为NONE。创建一个标准的Windows窗体应用程序,删除一个Label控件并注册MouseDown& MouseMove事件我有这个代码,我调用label1.DoDragDrop(label1,DragDropEffects.All | DragDropEffects.Link)。任何帮助将不胜感激。
这是我的表单代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DragDropLabel
{
public partial class Form1 : Form
{
Point m_ClickLocation;
bool _bDragging = false;
public Form1()
{
InitializeComponent();
}
private void OnLabelMouseDown(object sender, MouseEventArgs e)
{
m_ClickLocation = e.Location;
_bDragging = true;
}
private void OnLabelMouseMove(object sender, MouseEventArgs e)
{
if (_bDragging)
{
Point pt = e.Location;
Size dragSize = SystemInformation.DragSize;
if (Math.Abs(pt.X - m_ClickLocation.X) > dragSize.Width / 2 ||
Math.Abs(pt.Y - m_ClickLocation.Y) > dragSize.Height / 2)
{
DragDropEffects rc = label1.DoDragDrop(label1, DragDropEffects.All | DragDropEffects.Link);
_bDragging = false;
}
}
}
}
}
答案 0 :(得分:1)
标准编辑控件(文本框)不支持拖放,也不接受任何删除的文本。
答案 1 :(得分:1)
首先,改变
DragDropEffects rc = label1.DoDragDrop(label1, DragDropEffects.All | DragDropEffects.Link);
到
label1.DoDragDrop(label1.Text, DragDropEffects.Copy);
其次,你必须准备掉落目标。让我们假设,它是文本框。这是一个简单的扩展方法,它允许通过调用MyTextBox.EnableTextDrop()
:
static class TextBoxExtensions
{
public static void EnableTextDrop(this TextBox textBox)
{
if(textBox == null) throw new ArgumentNullException("textBox");
// first, allow drop events to occur
textBox.AllowDrop = true;
// handle DragOver to provide visual feedback
textBox.DragOver += (sender, e) =>
{
if(((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) &&
e.Data.GetDataPresent(typeof(string)))
{
e.Effect = DragDropEffects.Copy;
}
};
// handle DragDrop to set text
textBox.DragDrop += (sender, e) =>
{
if(((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) &&
e.Data.GetDataPresent(typeof(string)))
{
((TextBox)sender).Text = (string)e.Data.GetData(typeof(string));
}
};
}
}