前回の記事を振り返る:C# WPF:把文件给我拖进来!!!

本記事では、対応する続編「C# WPF:这次把文件拖出去!」を完成させます。
先に効果をご覧ください:

上記の効果を実現するコードは非常に少なく、XAMLでPreviewMouseLeftButtonDownイベントのみを登録すればよいです:
<Grid MouseMove="Grid_MouseMove" AllowDrop="True" Drop="Grid_Drop" DragEnter="Grid_DragEnter" PreviewMouseLeftButtonDown="Grid_PreviewMouseLeftButtonDown">
イベント処理コードは次の通りです:
// ファイルのドラッグアウト操作を処理
private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// 現在、各メニューはImageとTextBlockで構成されているため、
// ドラッグ対象がImageコントロールかどうかを判定し、その他のコントロールのドラッグは処理しない
var img = e.OriginalSource as Image;
if (img == null || img.Tag == null)
{
return;
}
var menuInfo = img.Tag as MenuItemInfo;
if(menuInfo==null)
{
return;
}
#region ドラッグコード
ListView lv = new ListView();
string dataFormat = DataFormats.FileDrop;
DataObject dataObject = new DataObject(dataFormat, new string[] { menuInfo.FilePath});
DragDropEffects dde = DragDrop.DoDragDrop(lv, dataObject, DragDropEffects.Copy);
#endregion
}
重要なのは後半のコード(ドラッグコード、ソースコードリポジトリパス)です。DragDrop.DoDragDropメソッドに元のファイルパスを渡す必要があり、OSがファイルのコピー操作を処理してくれます。
上記の操作はあまりにも単純で、OSレベルでのファイルコピーに過ぎません。百度网盤のようなドラッグ&ドロップによるダウンロード機能(下図参照)を実現するにはどうすればよいでしょうか。

この機能を実現するには、プログラムで多くの処理が必要です。ドロップされたパスを監視し、そのパスを取得したら元のファイルのネットワークパスを使ってダウンロードを行います。こちらの記事を参考にすることをお勧めします:WPF 拖拽文件(拖入拖出),监控拖拽到哪个位置,类似百度网盘拖拽。
また、WPFのドラッグ&ドロップについて詳しく解説しているこちらの記事もお勧めです:WPF 之 DragDrop 拖放实例。