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#でメッセージボックスを使う