かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Silverlight 4でファイルのドロップ

Silverlight 3でローカルのファイルに限定的にアクセスできるようになりました。
ただし、ファイルを開くダイアログとか経由じゃないと駄目だったような気がします。

Silverlight 4では、ブラウザにドロップされたファイルを開いたりすることが出来るようになってます。これは、HTMLベースのアプリケーションに比べて、直感的にファイルをアップロードするようなインターフェースが作りやすくなるかもしれません。
ということで、早速試してみました。

Dropを許可する

ドロップを許可するコントロールのAllowDropをTrueに設定します。ここでは、LayoutRootのGridに、その設定をしました。

<Grid x:Name="LayoutRoot" Background="White" AllowDrop="True">
</Grid>

イベントを作成する

次にDropイベントを作ります。先ほどのGridにDropイベントを登録します。

<Grid x:Name="LayoutRoot" Background="White" AllowDrop="True" Drop="LayoutRoot_Drop">
</Grid>

コードビハインドで、普通の.NET製アプリと同じ要領でドロップで受け取ったファイルを取得できるみたいです。

private void LayoutRoot_Drop(object sender, DragEventArgs e)
{
    // ファイルが1つドロップされること前提
    // ファイルを取得して
    var file= ((FileInfo[])e.Data.GetData(DataFormats.FileDrop))[0];
    var sb = new StringBuilder();
    // ファイル名を取得して
    sb.AppendLine(file.Name); // FullNameはセキュリティで怒られた

    // 一行目を読み込む(日本語はUTF-8じゃないとだめなのかな?)
    using (var r = file.OpenText())
    {
        sb.AppendLine(r.ReadLine());
    }

    // 結果の表示
    MessageBox.Show(sb.ToString());
}

実行してみよう

起動直後は、何も画面においてないので真っ白です。

ファイルをドロップしてみました。(キャプチャソフトがいけてないのか、マウスカーソルが砂時計でキャプチャされてますけど、ちゃんと普通のドロップの時のアイコンになります)

ちゃんと、ファイル名とファイルの中身が読み取れています。

これは、コンシューマー向けのアプリケーションを開発しているような人にとっては嬉しい機能じゃないだろうかと思います。