Silverlight実行基盤の強化
Silverlight 4では、ユーザーからの要望に応じて、印刷ダイアログの表示、プログラムからクリップボードへのアクセスといった機能が追加されています。
ここからは、Silverlight 4で強化された実行基盤について触れていきます。
ドラッグアンドドロップ
Silverlight 4では、デスクトップなどからファイルをドラッグしてSilverlight上にドロップすることが可能になりました。この機能を利用することで、デスクトップ上のファイルをSilverlight上にドロップして、テキスト情報や画像/動画情報をSilverlightのページ上に読み込むことができます。
図2にサンプルアプリケーションの動作イメージを示します。このサンプルは、ページ上部の緑色の四角形にファイルをドロップすると、その下にあるリストボックスにその内容を表示します。

リスト5は、このアプリケーションのXAMLコードです。
特に難しいところはありませんが、ファイルのドロップを許可する緑色の四角形(Rectangle)はAllowDrop属性にTrue(許可)を、ファイルのドロップを処理するDropイベントにRectangle_Dropイベントハンドラを指定しています。
<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に示します。ドロップされたファイルは次の順序で処理を行います。
- ドロップされたファイルの一覧を取得する。
- ファイルの種類を判別する。
- ファイルごとに読込処理を行う。
/// <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,
},
};
}
}
それぞれの処理を見ていきましょう。
- ドロップされたファイルの一覧を取得する
- ファイルの種類を判別する
- ファイルごとに読込処理を行う
ドロップされたファイルの一覧は、DragEventArgsクラスのDataプロパティがもつGetDataメソッドで取得できます。GetDataメソッドでドロップされたファイルの情報を取得するためには、文字定数DataFormats.FileDropを指定します。
GetDataメソッドで取得したデータはFileInfoクラスの配列なので、ファイルの拡張子ごとに処理を分岐します。
拡張子ごとにFileInfoオブジェクトからファイルを読み出し、リストボックスにアイテムを追加します。ここでは、イメージデータを取得するLoadImageメソッドだけを掲載していますが、サンプルには、テキストファイルからデータを取得するLoadTextメソッドも含まれているので確認してください。
このサンプルを実行すると図2の画面が起動します。緑色の四角形にファイルをドロップすると、リストボックスにそのファイルの内容が読み込まれることを確認できます。
