WPFファイルのドラッグ&ドロップ

WPFファイルのドラッグ&ドロップ

ファイルをアップロードする際は、通常アップロードボタンを用意し、クリックするとファイル(またはディレクトリ選択ダイアログ)が表示され、ファイル(またはディレクトリ)を選択した後、ダイアログオブジェクトからファイルパスを取得し、アップロード操作を実行します。

最終更新 2020/11/27 11:10
沙漠尽头的狼
読了目安 2 分
カテゴリ
WPF
タグ
.NET WPF ファイルのドラッグ

一、この記事を始める前に

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

ダイアログでファイルを選択

ダイアログでファイルを選択

選択ダイアログのコードは以下の通りです。

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つのイベントを登録するだけです:DragEnterDrop

まず、私の実装例をご覧ください。

QuickApp にファイルをドラッグ&ドロップ

QuickApp にファイルをドラッグ&ドロップ

Xaml でのイベント登録

イベントを登録します:

<Grid
  MouseMove="Grid_MouseMove"
  AllowDrop="True"
  Drop="Grid_Drop"
  DragEnter="Grid_DragEnter"
></Grid>

イベント処理メソッド:

  1. 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:ドラッグ&ドロップファイル操作を処理します。

  1. 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);
    }
}

三、この記事のまとめ

機能はとてもシンプルで、深く追求せず、使えれば十分です。

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2025/09/13

WPF から Avalonia への移行シリーズ:なぜ WPF プログラムを Avalonia に移行しなければならないのか

過去数年間、当社の上位機ソフトウェアは主に WPF と WinForm で開発されてきました。これらの技術は Windows プラットフォームで非常に便利であり、小規模試作から現在の規模拡大による納品まで、私たちを支えてきました。しかし、ビジネスの発展や顧客ニーズの変化に伴い、単一の Windows テクノロジースタックは私たちが必ず乗り越えなければならない壁となってきました。

続きを読む
同じカテゴリ / 同じタグ 2025/01/26

WPF カスタムXMLファイルによる国際化

この記事では、WPFプログラムでカスタムXMLファイルを使用して国際化を実現する方法について詳しく説明します。必要なNuGetパッケージのインストール、言語リストの動的取得、言語の動的切り替え、コードおよびXAMLインターフェースでの翻訳文字列の使用などを含み、ソースコードのリンクも提供し、開発者がWPFアプリケーションの国際化を簡単に実装できるように支援します。

続きを読む