C#でドロップされたファイルの名前を得る(WPF編 DragOver版)
WPFのC#で、TextBoxにドロップしたファイルのファイル名を取得します。Windowフォームの場合とちょっと違います。
目次
TextBoxのAllowDropをTrueにしただけではダメ
TextBoxにはAllowDropというプロパティがあって、それをTrueにさえすればDropしたデータにアクセスできるのかと思ってしまいますが、それだとファイルをドロップできないのです。 というわけで、MSDNの例を参考にしました。
手順
- TextBoxのAllowDropプロパティをTrueに設定する。 
- TextBoxのDragOverイベントとDropイベントにコードを記述する。 
- 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プロパティからデータを取得するのは、なんとなくわかります。でも、イベントハンドラ関係はなかなか理解できないですね。
公開日
広告
C#の入出力カテゴリの投稿
- C#でCSVファイルを読み込んでコレクションに入れてみた
- C#でInputBoxを使ってみた
- C#で「名前を付けて保存」ダイアログを使ってみた
- C#でクリップボードから文字列を取得する
- C#でクリップボードにデータを入れる
- C#でコマンドライン引数を取得する
- C#でテキストファイルを読んでみた (File.ReadAllText編)
- C#でドロップされたファイルの名前を得る(WPF編 DragOver版)
- C#でドロップされたファイルの名前を得る(WPF編 PreviewDragOver版)
- C#でドロップされたファイルの名前を得る(Windowフォーム編)
- C#でパイプを使ってデータを入力してみる
- C#でメッセージボックスを使う

