Я успешно создал функциональность DragDrop с пользовательскими элементами управления. Теперь я пытаюсь разрешить функциональность DragDrop для некоторых компонентов, таких как ToolStripButton.
Базовый класс 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, но событие DragDrop было бы неудачным из-за проблемы с многопоточностью / вызовом при доступе к свойству Tag ToolStripItem.
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, просто невозможно? Или я что-то не так делаю?