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

WPFのC#で、TextBoxにドロップしたファイルのファイル名を取得します。Windowフォームの場合とちょっと違います。

目次

  1. TextBoxのAllowDropをTrueにしただけではダメ
  2. 手順
  3. コード
  4. 動かしてみた

TextBoxのAllowDropをTrueにしただけではダメ

TextBoxにはAllowDropというプロパティがあって、それをTrueにさえすればDropしたデータにアクセスできるのかと思ってしまいますが、それだとファイルをドロップできないのです。 というわけで、MSDNの例を参考にしました。

手順

  1. TextBoxのAllowDropプロパティをTrueに設定する。

  2. TextBoxのDragOverイベントとDropイベントにコードを記述する。

  3. MainWindowメソッドで、TextBoxのイベントハンドラを設定する。

コード

XAMLです。AllowDropプロパティをTrueにしただけです。

<Window x:Class="drop_trial.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:drop_trial"
        mc:Ignorable="d"
        Title="MainWindow" Height="100" Width="200">
    <Grid>
        <TextBox Name="textbox" Margin="5" AllowDrop="True" Text="ここにドロップしてください" DragOver="textbox_DragOver" Drop="textbox_Drop" />
    </Grid>
</Window>

続いてコードです。

using System.Windows;
using System.Windows.Controls;

namespace drop_trial
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            textbox.AddHandler(TextBox.DragOverEvent, new DragEventHandler(textbox_DragOver), true);
            textbox.AddHandler(TextBox.DropEvent, new DragEventHandler(textbox_Drop), true);
        }

        private void textbox_DragOver(object sender, DragEventArgs e)
        {
            // マウスポインタを変更する。
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effects = DragDropEffects.All;
            }
            else
            {
                e.Effects = DragDropEffects.None;
            }
            e.Handled = false;
        }

        private void textbox_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                textbox.Text = string.Empty; // TextBoxの中身をクリアする。
                string[] filenames = (string[])e.Data.GetData(DataFormats.FileDrop); // ドロップしたファイル名を全部取得する。
                string filename = "";
                foreach (string t in filenames)
                {
                    filename = filename + t + "; ";
                }
                textbox.Text = filename;
            }
        }
    }
}

ドラッグされているデータがDragEventArgsに入ってて、それのEffectsプロパティを設定してマウスポインタを変えたり、Dataプロパティからデータを取得するのは、なんとなくわかります。でも、イベントハンドラ関係はなかなか理解できないですね。

動かしてみた

まず、ビルドして起動した状態です。 160430-5-01 そして、C:windowsから適当なファイルを2つドロップすると下図の様になります。 160430-5-02 試した環境は下記です。

  • Visual Studio 2015 Express for Windows Desktop

  • Windows 8.1

公開日

広告