SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

ダウンロード 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の画面が起動します。緑色の四角形にファイルをドロップすると、リストボックスにそのファイルの内容が読み込まれることを確認できます。

次のページ
印刷ダイアログの表示

この記事は参考になりましたか?

Silverlight 4で作る新しいRIAアプリケーション連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5682 2011/01/19 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー