我正在使用这个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类型的数据。当我在调试时,如果我在DragEventArgs e中深入挖掘,我可以找到我的数据。只是在第14行,它总是返回null,我找不到任何其他方式来获取数据。
答案 0 :(得分:0)
不是传递Object List的实例,而是创建一个类型为Object的Property Data的类。 创建类的实例,并使用要拖动的对象设置Data Property 在Map_DragDrop事件中调用GetData(),将typeof(MyDraggedData)作为参数传递并转换回原始对象
lookup DataFormats class和 IDataObject 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;
}