ドラッグ&ドロップでファイルの一覧を受け取るヘルパーメソッドを作って見ました。
今回はヘルパーメソッドを使うサンプルプログラムになります。
はじめXAMLを使わないコードを想定していましたが、コードビハインドで使うことも出来そうなのでXAML有りのサンプルプログラムになります。
ドラッグ&ドロップされたファイルの一覧は以下の流れでTextBlockのTextに反映されます。
TextBlockへD&D → コードビハインドでファイルの一覧をTextBlockのTagに反映 → Tagの購読処理でTextBlock.Textに反映
というような流れになっています。
ソースコード
ファイル名:dd01.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
</PropertyGroup>
</Project>
ファイル名:MainWindow.xaml.cs
using System.Collections.ObjectModel;
using System.Windows;
using NxLib.Helper;
namespace dd01;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Wiring.AcceptFiles(DdArea, files =>
{
if (DdArea.Tag is not ObservableCollection<string>) return;
ObservableCollection<string> fs = (ObservableCollection<string>)DdArea.Tag;
fs.Clear();
foreach(var s in files)
{
fs.Add(s);
}
});
DataContext = new MainViewModel();
}
}
ファイル名:Helpers\Wiring.cs
using System.Windows;
namespace NxLib.Helper;
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);
};
}
}
ファイル名:ViewModels\MainViewModel.cs
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace dd01;
public class MainViewModel : INotifyPropertyChanged
{
public ObservableCollection<string> Files { get; private set; } = [];
private string _message = "こちらにドラッグ&ドロップしてください。";
public string Message
{
get => _message;
set
{
if (_message != value)
{
_message = value;
OnPropertyChanged();
}
}
}
public MainViewModel()
{
Files.CollectionChanged += (sender, e) =>
{
string msg = "";
foreach(var s in Files)
{
msg += s + "\n";
};
Message = msg;
};
}
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string? propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
ファイル名:MainWindow.xaml
<Window x:Class="dd01.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:dd01"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<TextBlock
x:Name="DdArea"
Text="{Binding Message}"
Tag="{Binding Files}"
FontSize="24"
TextAlignment="Center"
TextWrapping="Wrap"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</Window>
実行イメージ
・起動時
・ファイルをドラッグ&ドロップ
ファイルの一覧が表示される。
コメント