【问题标题】:Preventing dropping an item onto self防止物品掉到自己身上
【发布时间】:2013-02-03 17:39:31
【问题描述】:

好的,所以我将在这里首次尝试拖放功能。我已经处理了鼠标按下并从我的源代码管理中调用了 DoDragDrop。

我想要实现的是将帐户从一个 MDI 子级复制/移动到另一个。在我的上下文中,退回到源代码管理是没有任何意义的。

我正在查看拖动输入,您可以在其中提供有关当前效果的信息。

我想要如下所示的东西:

If(eventData.Source != accountList)
{
    eventData.Effect = DragDropEffects.Copy;
}

但是,我似乎找不到任何方法来确定数据的源控制。我唯一能想到的就是拥有一个自定义类并将其传递到数据中并嵌入源代码控制,还是我遗漏了一些明显的东西?

【问题讨论】:

    标签: c# winforms drag-and-drop


    【解决方案1】:

    这是在 WPF 中吗?如果是,那么您可以使用传递给您的方法的事件的 OriginalSource 属性,因为它应该映射到您在调用 DoDragDrop 方法时传递的源。

    如果您使用的是 Windows 窗体,则无法在开始操作时传递自己的源,因此最好的办法是在您创建的 IDataObject 中附加自定义数据,并据此确定源。

    在我看来,拖放用例是疯狂的,请确保您还涵盖从外部应用程序开始拖动的情况,因为您将收到相同的 DragEnter 和所有其他方法,就像您在应用程序中启动它一样.

    【讨论】:

      【解决方案2】:

      在对 DoDragDrop 的调用中,将您的对象添加为额外格式:

       var dragSource = this;
       var data = "Hello";
      
       var dataObj = new DataObject(data);
       dataObj.SetData("DragSource", dragSource);
       DragDrop.DoDragDrop(dragSource, dataObj, DragDropEffects.Copy);
      

      现在在 OnDrag 处理程序中很容易获得拖动源:

      protected override void OnDrop(DragEventArgs e)
      {
        var data = e.Data.GetData(DataFormats.Text);
        var dragSource = e.Data.GetData("DragSource");
        ...
      }
      

      【讨论】:

      • 这是一个很好的答案。但是你把代码弄乱了一点。该行应为DragDrop.DoDragDrop(dataObj, DragDropEffects.Copy);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      相关资源
      最近更新 更多