2

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を返し、そのデータを取得する他の方法が見つからないというだけです。

4

1 に答える 1

1

Object List のインスタンスを渡す代わりに、タイプ object の Property Data を持つクラスを作成します。クラスのインスタンスを作成し、ドラッグするオブジェクトで Data プロパティを設定します Map_DragDrop イベントで GetData() を呼び出し、typeof(MyDraggedData) を引数として渡し、元のオブジェクトにキャスト バックします

Lookup 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;
}
于 2016-05-06T13:31:18.597 に答える