可以';t从DragEventArgs获取数据.getData()返回null

本文关键字:getData 数据 null 返回 获取 DragEventArgs 可以 | 更新日期: 2023-09-27 18:28:58

我正在开发这个wpf应用程序,您可以在TreeView列表中单击StackPanel并将其拖动到窗口的另一个区域(在本例中为地图)。

当我创建StackPanel时,我将必要的数据存储在Tag属性中:

private StackPanel makeStackPanel(messageIconType itemType, 
                                   string filePath, CustomClass message)
    {
        StackPanel stack = new StackPanel();
        stack.Orientation = Orientation.Horizontal;
        stack.Tag = new List<Object>{message, itemType};
        stack.MouseDown += new MouseButtonEventHandler(stack_MouseDown);
        return stack;
    }

当我点击StackPanel时,MouseDown的事件就会被触发。我制作了一个DataObject,这样我就可以将数据传递给捕捉"DragDrop"事件触发的方法。

private void stack_MouseDown(object sender, System.Windows.Input.MouseEventArgs e)
    {
        StackPanel sp = (StackPanel)sender;
        DataObject dataObj = new DataObject();
        dataObj.SetData(typeof(List<Object>), (List<Object>)sp.Tag);
        DragDrop.DoDragDrop(sp, dataObj, DragDropEffects.Copy);
    }

当我们使用DragDrop方法时,e.Data.GetData(typeof(List))返回null。

1    private void Map_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
2    {
3        string[] data = e.Data.GetFormats();
4        int i=0;
5        if(e.Data.GetDataPresent(data[0]))
6        {
7            i++;
8        }
9        if (e.Data.GetDataPresent(typeof(List<Object>)))
10       {
11           i++;
12       }
13       List<Object> obj = (List<Object>)e.Data.GetData(typeof(List<Object>));
14   }

在此之前的行是健全性检查。e.Data.GetFormats()返回一个字符串,表示该格式为List。第5行和第9行的计算结果均为true,因此存在List类型的Data。当我在调试时,如果我在DragEventArgs e中挖掘得足够深入,我就能找到我的数据。只是在第14行,它总是返回null,我找不到任何其他方法来获取数据。

可以';t从DragEventArgs获取数据.getData()返回null

与其传递Object List的实例,不如创建一个具有Object类型的Property Data的类。创建类的实例,并使用要拖动的对象设置数据属性在Map_DragDrop事件中,调用GetData(),将typeof(MyDraggedData)作为参数传递给原始对象

查找DataFormats类和IDataObject实现

public class MyDraggedData
{
    public object Data { get; set; }
}
private void stack_MouseDown(object sender, System.Windows.Input.MouseEventArgs e)
{
    StackPanel sp = (StackPanel)sender;
    MyDraggedData data = new MyDraggedData();
    data.Data = sp.Tag;
    DragDrop.DoDragDrop(sp, data, DragDropEffects.Copy);
}

private void Map_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
  MyDraggedData data = (MyDraggedData)e.Data.GetData(typeof(MyDraggedData));
  List<Object> obj = (List<Object>)data.Data;
}