c# - 无法从 DragEventArgs 获取数据。 getData() 返回空值

标签 c# wpf

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

当我创建 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() 返回一个字符串,说明该格式是一个列表。第 5 行和第 9 行的计算结果均为 true,因此存在类型为 List 的数据。当我在调试时,如果我在 DragEventArgs e 中挖掘得足够深,我可以找到我的数据。只是在第 14 行,它总是返回 null,我找不到任何其他方法来获取该数据。

最佳答案

不是传递对象列表的实例,而是创建一个具有对象类型属性数据的类。 创建该类的实例并使用要拖动的对象设置数据属性 在 Map_DragDrop 事件调用 GetData() 中,将 typeof(MyDraggedData) 作为参数传递并转换回原始对象

lookup DataFormats classIDataObject implementation

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;
}

关于c# - 无法从 DragEventArgs 获取数据。 getData() 返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406715/

相关文章:

c# - 在 C# : performance and elegance 中引发事件

wpf - 增加StrokeThickness,但保持Path的尺寸

c# - WPF&MVVM : access to Controls from RelayCommand()

c# - 如何接受 HTTP 400 和 HTTP 500 作为 Visual Studio 负载测试中的有效响应代码?

c# - 重载方法中的 StackOverflowException

c# - 如何阅读 MVC OWIN AuthenticationProperties?

c# - 该组中没有可用的控件。将项目拖到此文本上以将其添加到工具箱“Visual Studio 2012

c# - 图像显示中的内存管理

c# - 用户控件内容未呈现

WPF-调整 child 大小以填补 parent