2013-08-23 42 views
2

我正在研究這個wpf應用程序,您可以在TreeView列表中單擊一個StackPanel並將其拖到窗口的另一個區域(在本例中爲地圖)。無法從DragEventArgs獲取數據。 getData()返回null

當我創建的StackPanel,我存儲在標籤屬性所需的數據:

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行的結果均爲真,因此存在List類型的數據。當我在調試時,如果我深入挖掘DragEventArgs e,我可以找到我的數據。只是在第14行中,它總是返回null,我找不到任何其他獲取該數據的方式。

回答

0

而不是傳遞對象列表的實例,而是創建一個類型爲對象的屬性數據的類。 創建類的實例,並與要拖到 在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; 
} 
相關問題