在WPF中拖放技术

6

我在我的WPF应用程序中有一个TreeViewCanvas。我正在尝试实现功能,使用户可以拖动一个TreeViewItem,并在用户放置在canvas上时调用一个方法,将TreeViewItem头作为参数传递给此方法。

到目前为止,我已经完成了以下工作:

private void TreeViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
     if (e.Source.GetType().Name.Equals("TreeViewItem"))
     {
         TreeViewItem item = (TreeViewItem)e.Source;

         if (item != null)
         {
              DataObject dataObject = new DataObject();
              dataObject.SetData(DataFormats.StringFormat, item.Header.ToString());
              DragDrop.DoDragDrop(item, dataObject, DragDropEffects.Copy);
         }
     }
 }

当我在画布上拖放时,什么都没有发生。因此,我不确定接下来该怎么做。我觉得这是一件非常小的事情,但我很困惑。如何调用方法并检测标题已被拖放?有什么想法吗?

你的 AllowDrop 属性设置为 true 了吗? - swabs
1
你能否发布一些代码,展示Canvas和TreeView的标记和代码后台?你应该有一些拖放事件处理程序。它们是否被触发了? - Josh C.
查看此帖子的答案。您可能没有正确引发事件。 - swabs
1个回答

8

您需要在目标元素上将 AllowDrop 设置为 true,然后处理目标元素上的 DragOverDrop 事件。

示例:

    private void myElement_DragOver(object sender, DragEventArgs e)
    {
        if (!e.Data.GetDataPresent(typeof(MyDataType)))
        {
            e.Effects = DragDropEffects.None;
            e.Handled = true;
        }
    }

    private void myElement_Drop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(typeof(MyDataType)))
        {
            // do whatever you want do with the dropped element
            MyDataType droppedThingie = e.Data.GetData(typeof(MyDataType)) as MyDataType;
        }
    }

AllowDrop 实际上已经设置为 true,所以这不是问题。您能否详细说明 DragOver 和 Drop 事件部分?它们应该是画布的事件吗?画布的事件如何知道拖放应该传输 TreeViewItem 的标题? - Dot NET
@DotNET:我已经编辑了我的回答,添加了DragOver和Drop事件处理程序的基本内容。 - Matt Burland
谢谢,这应该有助于我解决我的问题 :) - Dot NET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接