|
■No9282 (ケン さん) に返信 > DragEnterとItemDragはListViewに入っている > アイティムの選択イベントだと解釈しているのですが > 間違っていますか?
ドロップ先(この場合は ListView)が、 「ファイルはドロップできるが、テキストデータではドロップ不可」 などを示すための、「受け入れ準備のための処理」が記述されていないと、ドロップできません。
ドロップ先では、外部からドラッグされてきたアイテムの座標に対して、 ListView 領域内に入ったら …… DragEnter が発生 ListView 領域上を通過中に …… DragOver が発生 ListView 領域から外れたら …… DragLeave が発生 のようにイベントが発生しますので、ここに処理を記述します。
たとえば、ファイルのドロップのみを受け付けるなら、DragEnter イベントはこうなります。
if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) { e.Effect = e.AllowedEffect; }
ドラッグ中のマウスカーソルを、コピーのアイコンにしたいなら、
if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) { if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) { e.Effect = DragDropEffects.Copy; } }
という感じです。
Shift, Control などのキー入力に対して、コピー/移動などを切り替えたい場合は、 e.KeyState の判定を加えてください。
ListView 全域にドロップ可能にするのではなく、特定のアイテム上だけにドロップ可能とさせるなら、 (DragEnter ではなく)DragOver イベントを用いるようにし、そこで ListView の HitTest メソッドを 呼び出してやると良いかと。
|