Свойство AllowDrop не работает для ToolStripItems - PullRequest
2 голосов
/ 16 ноября 2011

Я успешно создал функциональность 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, просто невозможно? Или я что-то не так делаю?

1 Ответ

1 голос
/ 10 декабря 2011

Вот код, который я получил, чтобы работать для меня.

Я назначаю свойства 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);
}
...