しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

WPF とドラッグドロップ (2)

WinForm の時は DragEnter と DragDrop の 2つのイベントハンドラを書いてましたが、WPF の場合は DragEnter ではなく DragOver を使う必要があるっぽいです。

例えば DragEnter でドロップされたテキストやファイルの確認をして、ドラッグの可否を判別するコードは WPF では動きませんでした。RoutedEvent になったことが影響しているのかもしれません。

private void Window_DragEnter(object sender, DragEventArgs e)
{
    // DragDropEffects.Copy を指定しても、実際にはカーソルに反映されない
    e.Effects = DragDropEffects.Copy;

    // 処理したので true を指定する
    e.Handled = true;
}

private void Window_DragOver(object sender, DragEventArgs e)
{
    // 正しく反映される
    e.Effects = DragDropEffects.Copy;

    // 処理したので true を指定する
    e.Handled = true;
}

なので、WPF では DragOver でドラッグの可否を判別した方が無難です。DragDropEffects.None を指定していてもドラッグ可能状態になるので結構やばいです。