一、この記事を始める前に
ファイルをアップロードする際、通常はアップロードボタンを用意し、クリックするとファイル(またはフォルダ選択)ダイアログが開きます。ファイル(またはフォルダ)を選択した後、ダイアログオブジェクトからファイルパスを取得し、アップロード処理を行います。
ダイアログでファイルを選択

選択ダイアログのコードは以下の通りです。
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "Exeファイルを選択";
openFileDialog.Filter = "exeファイル|*.exe";
openFileDialog.FileName = string.Empty;
openFileDialog.FilterIndex = 1;
openFileDialog.Multiselect = false;
openFileDialog.RestoreDirectory = true;
openFileDialog.DefaultExt = "exe";
if (openFileDialog.ShowDialog() == false)
{
return;
}
string txtFile = openFileDialog.FileName;
しかし、一般的にユーザー体験が最も良いのは、ファイルを直接ドラッグ&ドロップする方法です。
百度網盤のドラッグ&ドロップアップロード

以下、WPF でのファイルドラッグ&ドロップの実装方法について簡単に説明します。
二、WPF でファイルをドラッグ&ドロップするには?
実はとても簡単で、ドラッグを受け付けるコントロール(またはコンテナ)に次の2つのイベントを登録するだけです:DragEnter、Drop。
まず、私の実装例をご覧ください。
QuickApp にファイルをドラッグ&ドロップ

Xaml でのイベント登録
イベントを登録します:
<Grid
MouseMove="Grid_MouseMove"
AllowDrop="True"
Drop="Grid_Drop"
DragEnter="Grid_DragEnter"
></Grid>
イベント処理メソッド:
- Grid_DragEnter 処理
private void Grid_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effects = DragDropEffects.Link;
}
else
{
e.Effects = DragDropEffects.None;
}
}
DragDropEffects.Link:ドラッグ&ドロップファイル操作を処理します。
- Grid_Drop 処理
これは実際のドラッグ&ドロップ操作を処理するメソッドです。ドロップされたファイルのパスを取得し(OSのファイルショートカット(拡張子 lnk)の場合は、COMコンポーネント(本記事の焦点ではありません。詳細はオープンソースプロジェクトを参照)を使用して実際のファイルパスを取得します)、その後続の処理(ファイルアップロードなど)を行います。
private void Grid_Drop(object sender, DragEventArgs e)
{
try
{
var fileName = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
MenuItemInfo menuItem = new MenuItemInfo() { FilePath = fileName };
// ショートカットの場合、ターゲットファイルのパスを取得する必要があります
if (fileName.ToLower().EndsWith("lnk"))
{
WshShell shell = new WshShell();
IWshShortcut wshShortcut = (IWshShortcut)shell.CreateShortcut(fileName);
menuItem.FilePath = wshShortcut.TargetPath;
}
ImageSource imageSource = SystemIcon.GetImageSource(true, menuItem.FilePath);
System.IO.FileInfo file = new System.IO.FileInfo(fileName);
if (string.IsNullOrWhiteSpace(file.Extension))
{
menuItem.Name = file.Name;
}
else
{
menuItem.Name = file.Name.Substring(0, file.Name.Length - file.Extension.Length);
}
menuItem.Type = MenuItemType.Exe;
if (ConfigHelper.AddNewMenuItem(menuItem))
{
AddNewMenuItem(menuItem);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
三、この記事のまとめ
機能はとてもシンプルで、深く追求せず、使えれば十分です。