我已经使用用户控件成功创建了DragDrop功能。现在,我试图在某些组件(例如ToolStripButton)上允许DragDrop功能。
基类ToolStripItem支持AllowDrop和DragEnter / DragDrop事件...
ToolStripButton在设计器中隐藏了这些属性,但是它们是可公开访问的。
最初,我尝试对每个ToolStripButton执行以下操作:
button.AllowDrop = true;
button.DragEnter += new DragEventHandler(button_DragEnter);
button.DragDrop += new DragEventHandler(button_DragDrop);
但是,这些事件从未触发过。这些按钮包含在MenuStrip中,因此我将MenuStrip.AllowDrop更改为true。然后,我开始获取DragEnter和DragDrop事件,但是在访问ToolStripItem的Tag属性时,由于线程/调用问题,DragDrop事件将失败。
不能调用ToolStripItems。因此,我尝试使用相同的功能调用其容器MenuStrip。我仍然遇到线程/调用问题,在尝试访问ToolStripItem时线程立即停止运行。
这是调用后我用来检索标签信息的代码:
void button_DragDrop(object sender, DragEventArgs e)
{
menuStrip.Invoke(new DragEventHandler(MyDragFunction), new object[] { sender, e });
}
void MyDragFunction(object sender, DragEventArgs e)
{
int id = (int)((ToolStripButton)sender).Tag;
// Debugging never reaches this line
int dragId = (int)e.Data.GetData(DataFormatName, false);
MoveItem(id, dragId);
}
拖放到像ToolStripItem这样的组件上根本不可能吗?还是我做错了什么?
最佳答案
这是我要为我工作的代码。
我将DragDrop属性分配给表单构造函数,因为它们在设计器中是隐藏的。
foreach (object o in menuStrip.Items)
{
if (o is ToolStripButton)
{
ToolStripItem item = (ToolStripItem)o;
item.AllowDrop = true;
item.DragEnter += new DragEventHandler(item_DragEnter);
item.DragOver += new DragEventHandler(item_DragOver);
item.DragDrop += new DragEventHandler(item_DragDrop);
}
}
private void item_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormatName, false))
{
e.Effect = DragDropEffects.Move;
}
}
private void item_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormatName, false))
{
e.Effect = DragDropEffects.Move;
}
}
private void item_DragDrop(object sender, DragEventArgs e)
{
int id = (int)e.Data.GetData(DataFormatName, false);
int category = Convert.ToInt32((sender as ToolStripButton).Tag);
MyFunction(category, id);
}