かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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());
}

実行してみよう

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

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

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

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