2012年11月30日金曜日

ドラッグ アンド ドロップ したファイルの内容を表示

AllowDrop を true にして、Window をドラッグアンドドロップの操作対象にします。これを指定しないと、DragOver などのイベントが発生しません。

DragOver イベントの処理で、ドラッグ中のモノがファイルかどうかを判断して、ファイルならドロップを有効にします。イベント引数 DragEventArgsの Effects プロパティを DragDropEffects.All と マウスカーソルがドロップできるアイコンになります。

e.Effects = e.Data.GetDataPresent(DataFormats.FileDrop) ?DragDropEffects.All : DragDropEffects.None;

以下のコードで、実際にファイルをドラッグアンドドロップすると、テキストブロックにファイルの内容が表示されるので、一見うまく動作しているようですが、問題点があります。
ファイル以外のモノを DragOver しても、マウスカーソルが DragDropEffects.None の形になりません。
おそらく、Window の DragOverイベントの処理のあとに、なんらかの処理がされてマウスカーソルが上書きされてしまっているようなので、DragOver イベントハンドラに次のコードを追加して、なんらかの処理をさせないようにします。

e.Handled = true;

MainWindow.xaml

<Window x:Class="DragDropTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="200" Width="300"
        DragOver="Window_DragOver" Drop="Window_Drop" AllowDrop="True">
    <TextBlock Name="textBlock1" />
</Window>

MainWindow.xaml.cs

using System.IO;
using System.Windows;

namespace DragDropTest
{
    public partial class MainWindow Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_DragOver(object sender, DragEventArgs e)
        {
            e.Effects = e.Data.GetDataPresent(DataFormats.FileDrop) ?                  DragDropEffects.All : DragDropEffects.None;
        }

        private void Window_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] docPath = (string[])e.Data.GetData(DataFormats.FileDrop);
                this.textBlock1.Text = File.ReadAllText(docPath[0]);
            }
        }
    }
}

0 件のコメント:

コメントを投稿