c# - AllowDrop 属性不适用于 ToolStripItems

标签 c# winforms drag-and-drop toolstrip

我已经成功地创建了带有用户控件的 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);
}

关于c# - AllowDrop 属性不适用于 ToolStripItems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8143882/

相关文章:

javascript - 拖放应用负位置

c# - 传递给 Controller ​​的数组接收为 NULL

c# - 是否可以覆盖配置中的硬编码事务超时?

qt - QML:原始模型中的动态 View 重新排序

javascript - 为什么 event.clientX 在 firefox 中对于 dragend 事件错误地显示为 0?

c# - 通过单击控件显示工具提示文本

c# - Sharepoint 自定义字段

C# 7 模式匹配

c# - devexpress 枢轴字段的货币区域设置

c# - RichTextBox 中的自定义链接