C#でドロップされたファイルの名前を得る(WPF編 PreviewDragOver版)

ファイルをドロップすることでそのファイル名を取得できると、ファイル名の入力が楽になります。テキストボックスにファイルをドロップする場合、Window Formアプリでの方法とWPFアプリでの方法が異なります。

目次

  1. WPFでの手順
  2. WPFアプリを作って試してみました
    1. シナリオ
    2. レイアウトを作る
    3. コードを書く
    4. 試してみた

WPFでの手順

MSDNに説明があります。 ポイントは下記です。

  • AllowDropプロパティをtrueにする。

  • PreviewDragOverイベントでハンドルする。

  • Dropイベントで取得する。

WPFアプリを作って試してみました

シナリオ

フォームにテキストボックスを1つ貼り付けて、そこにエクスプローラーからファイルをドロップすると、そのファイルの名前を表示してみます。

レイアウトを作る

まず、フォームにテキストボックスを1つドロップして適当な大きさにします。次に、そのテキストボックスのAcceptsReturnプロパティをtrueにして、複数行表示できるようにします。そして、テキストボックスのAllowDropプロパティをtrueにして、ドロップできるようにします。 160106-1-01

コードを書く

テキストボックスを選択して、プロパティウィンドウの「雷」のマークをクリックすると、テキストボックスのイベントが表示されます。その中から、PreviewDragOverイベントの入力欄をダブルクリックすると、コードウィンドウの方にそのイベントの空のコードが自動的に記述されます。 160106-1-02 そこに、下記のように記述します。

private void textBox_PreviewDragOver(object sender, DragEventArgs e)
{
    e.Effects = DragDropEffects.Copy; // マウスカーソルをコピーにする。
    e.Handled = e.Data.GetDataPresent(DataFormats.FileDrop); // ドラッグされてきたものがFileDrop形式の場合だけ、このイベントを処理済みにする。
}

これで、テキストボックスの上にドラッグしたときに、カーソルの形状が変わり、ドロップを受け入れられるようになります。 次に、同様にDropイベントにコードを記述します。 160106-1-03

private void textBox_Drop(object sender, DragEventArgs e)
{
    textBox.Text = string.Empty; // テキストボックスを空にする。
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); // ドロップされたものがFileDrop形式の場合は、各ファイルのパス文字列を文字列配列に格納する。
    if (files != null)
    {
        foreach (string uriString in files)
        {
            textBox.Text = textBox.Text + System.IO.Path.GetFileName(uriString) + "\r\n"; // パス文字列からファイル名を抜き出して、テキストボックスにファイル名を書き込む。
        }
    }
}

試してみた

実際にプロジェクトをビルドして、エクスプローラーからファイルを3つドロップしてみました。 160106-1-04 ファイル名を取得できました。 Windows FormのコントロールとWPFのコントロールは、動作が違うのですね。 試した環境は下記です。

  • Visual Studio 2015 Express for Windows Desktop

  • Windows 8.1

公開日

広告