2013年07月02日

WPFサンプル:エクスプローラーからファイルをドラッグ&ドロップする

   このエントリーをはてなブックマークに追加 Clip to Evernote
エクスプローラーからファイルをドラッグ&ドロップすると、そのファイルのフルパスが ウィンドウに表示されるというサンプルです。
XAMLでは、Window の AllowDropプロパティを trueにすることで、D&Dを受け付けるようにしています。

以下は左側のエクスプローラから複数のファイルを選択し、右側のアプリケーションウィンドウのD&Dした画面です。

DDExplorer


イベントハンドラは、PreviewDragOver と Drop の2つ。(XAML参照のこと)

<Window x:Class="DragFromExplorerSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:DragFromExplorerSample"
        Title="MainWindow" Height="350" Width="525"
        AllowDrop="True"
        Drop="Window_Drop" PreviewDragOver="Window_PreviewDragOver">
    <Window.DataContext>
        <my:MyFileList />
    </Window.DataContext>
    <Grid>
        <ListBox HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch"
                 ItemsSource="{Binding FileNames}" />
    </Grid>
</Window>

C#側では、PreviewDragOverイベントで、ファイルのDropのときだけ受け付けるようにしています。
Dropイベントでは、Dragされたファイル(複数可)のパスをMyFileListというコレクションに入れています。
XAMLからもお分かりのように、直接ListBoxにAddしているのではなく、データバインディングを利用しています。
以下、C#のソースコードです。

using System.Collections.ObjectModel;
using System.Windows;
namespace DragFromExplorerSample {
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }
        private void Window_Drop(object sender, DragEventArgs e) {
            MyFileList list = this.DataContext as MyFileList;
            string[] files = e.Data.GetData(DataFormats.FileDrop) as string[];
            if (files != null) {
                foreach (var s in files)
                    list.FileNames.Add(s);
            }
        }
        private void Window_PreviewDragOver(object sender, DragEventArgs e) {
            if (e.Data.GetDataPresent(DataFormats.FileDrop, true))
                e.Effects = DragDropEffects.Copy;
            else
                e.Effects = DragDropEffects.None;
            e.Handled = true;
        }
    }
    public class MyFileList {
        public MyFileList() {
            FileNames = new ObservableCollection<string>();
        }
        public ObservableCollection<string> FileNames {
            get;
            private set;
        }
    }
}



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52326682