WPFをWinFormsライクに使う:ドラッグ&ドロップでファイルを渡す。

コンピュータ

エクスプローラーからファイルをコントロールにドラッグ&ドロップで渡すコードに成ります。

using System;
using System.Linq;
using System.Windows;
using System.Windows.Input;

public static class Wiring
{
    // D&D: 指定拡張子だけ受け付ける(exts 省略可)
    public static void AcceptFiles(FrameworkElement el, Action<string[]> onFiles, params string[] exts)
    {
        el.AllowDrop = true;
        el.Drop += (_, e) =>
        {
            if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return;

            var files = (string[])e.Data.GetData(DataFormats.FileDrop)!;

            if (exts is { Length: > 0 })
                files = files
                    .Where(f => exts.Any(x => f.EndsWith(x, StringComparison.OrdinalIgnoreCase)))
                    .ToArray();

            if (files.Length > 0)
                onFiles(files);
        };
    }
}

・第一引数
FrameworkElementは様々なコントロールのクラスの親クラスになっているので、AcceptFilesFrameworkElementの派生クラスである様々なコントロールを受け入れることが出来ます。

・第二引数
Action<string[]> onFilesはドラッグ&ドロップで呼び出されるコードをActionとして渡します。
ドラッグ&ドロップで渡されるファイルの一覧はActionの引数onFilesとして文字列の配列で渡されるので、その仕様に合わせたActionを定義する必要があります。

・第三引数
params string[] exts
ドラッグ&ドロップで受け入れるファイルの拡張子を設定します。
jpegやpngなどの拡張子を指定することで画像ファイルのみを受け入れる様な場合などに使います。

※サンプルコードの動作は未検証、後で検証します。

初期化用に1回だけ呼ばれることを想定していて、同じコントロールで複数呼び出すと破綻する作りになっています。

コメント