CodeZine(コードジン)

特集ページ一覧

Silverlight 4で強化された実行環境

Silverlight 4で作る新しいRIAアプリケーション(5)

  • LINEで送る
  • このエントリーをはてなブックマークに追加

ダウンロード sample.zip (1.2 MB)

目次

Silverlight実行基盤の強化

 Silverlight 4では、ユーザーからの要望に応じて、印刷ダイアログの表示、プログラムからクリップボードへのアクセスといった機能が追加されています。

 ここからは、Silverlight 4で強化された実行基盤について触れていきます。

ドラッグアンドドロップ

 Silverlight 4では、デスクトップなどからファイルをドラッグしてSilverlight上にドロップすることが可能になりました。この機能を利用することで、デスクトップ上のファイルをSilverlight上にドロップして、テキスト情報や画像/動画情報をSilverlightのページ上に読み込むことができます。

 図2にサンプルアプリケーションの動作イメージを示します。このサンプルは、ページ上部の緑色の四角形にファイルをドロップすると、その下にあるリストボックスにその内容を表示します。

図2 ファイルをSilverlightアプリケーションにドロップしている様子
図2 ファイルをSilverlightアプリケーションにドロップしている様子

 リスト5は、このアプリケーションのXAMLコードです。

 特に難しいところはありませんが、ファイルのドロップを許可する緑色の四角形(Rectangle)はAllowDrop属性にTrue(許可)を、ファイルのドロップを処理するDropイベントにRectangle_Dropイベントハンドラを指定しています。

リスト5 ドラックアンドドロップのサンプルコード(Printing.xaml)
<StackPanel x:Name="LayoutRoot">
	<StackPanel>
	    <StackPanel>
	        <TextBlock Text="ファイルを下の領域にドロップしてください。" />
	        <Rectangle x:Name="dropTarget" Width="100" Height="100"
                       Fill="Green" AllowDrop="True" Drop="Rectangle_Drop" />
	    </StackPanel>
	    <ListBox x:Name="dropContents">
	        <ListBox.ItemsPanel>
	            <ItemsPanelTemplate>
	                <StackPanel Orientation="Horizontal" />
	            </ItemsPanelTemplate>
	        </ListBox.ItemsPanel>
	    </ListBox>
	</StackPanel>
    <StackPanel x:Name="commandPanel" />
</StackPanel>

 C#側のコードをリスト6に示します。ドロップされたファイルは次の順序で処理を行います。

  1. ドロップされたファイルの一覧を取得する。
  2. ファイルの種類を判別する。
  3. ファイルごとに読込処理を行う。
リスト6 ドロップされたファイルの処理(Printing.xaml.cs)
/// <summary>
/// ドロップされたファイルの拡張子ごとにファイルを読み出し、リストボックスに表示する。
/// </summary>
private void Rectangle_Drop(object sender, DragEventArgs e)
{
    // 1.ドロップされたファイルの一覧を取得する。
    var item = e.Data.GetData(DataFormats.FileDrop);
    var dropFiles = item as FileInfo[];
    if (dropFiles == null) return;

    foreach (var dropFile in dropFiles)
    {
        ListBoxItem listItem = null;
        // 2.ファイルの種別を判別する。
        if (0 < (new string [] {".txt", ".cs", ".vb"})
                .Count(ext => ext == dropFile.Extension))
            listItem = LoadText(dropFile);   // 3.ファイルごとに読込処理を行う
        else if (0 < (new string [] {".png", ".jpg", ".jpeg"})
                     .Count(ext => ext == dropFile.Extension))
            listItem = LoadImage(dropFile);  // 3.ファイルごとに読込処理を行う

        if (listItem == null)
            return;
        dropContents.Items.Add(listItem);
    }
}

/// <summary>
/// 3.ファイルごとに読込処理を行う
/// テキストファイルの情報を読み込む
/// </summary>
private static ListBoxItem LoadImage(FileInfo dropFile)
{
    using (var readStream = dropFile.OpenRead())
    {
        var bitmapImage = new BitmapImage();
        bitmapImage.SetSource(readStream);

        return new ListBoxItem
        {
            Height = 100, Width = 100,
            Content = new Image
            {
                Stretch = Stretch.Fill,
                Source = bitmapImage,
            },
        };
    }
}

 それぞれの処理を見ていきましょう。

  1. ドロップされたファイルの一覧を取得する
  2.  ドロップされたファイルの一覧は、DragEventArgsクラスのDataプロパティがもつGetDataメソッドで取得できます。GetDataメソッドでドロップされたファイルの情報を取得するためには、文字定数DataFormats.FileDropを指定します。

  3. ファイルの種類を判別する
  4.  GetDataメソッドで取得したデータはFileInfoクラスの配列なので、ファイルの拡張子ごとに処理を分岐します。

  5. ファイルごとに読込処理を行う
  6.  拡張子ごとにFileInfoオブジェクトからファイルを読み出し、リストボックスにアイテムを追加します。ここでは、イメージデータを取得するLoadImageメソッドだけを掲載していますが、サンプルには、テキストファイルからデータを取得するLoadTextメソッドも含まれているので確認してください。

 このサンプルを実行すると図2の画面が起動します。緑色の四角形にファイルをドロップすると、リストボックスにそのファイルの内容が読み込まれることを確認できます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Silverlight 4で作る新しいRIAアプリケーション

もっと読む

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト かるあ (杉山 洋一)(カルア(スギヤマ ヨウイチ))

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5