TreeView リストの StackPanel をクリックして、ウィンドウの別の領域 (この場合はマップ) にドラッグできるこの wpf アプリケーションに取り組んでいます。
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 のイベントが発生します。「DragDrop」イベントの発生をキャッチするメソッドにデータを渡すことができるように、DataObject を作成します。
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を返し、そのデータを取得する他の方法が見つからないというだけです。