まず初めに、このプログラムで実装する機能の動作を、下記に解説しておきます。Expression Blend 4(以下Blend 4)に実装されているTransitionEffectのSlideInを使って、画像を表示します。
画面上には画像と画像名の一覧が表示されたListBoxコントロールがあります。ListBoxコントロールから任意の画像を次々と選択していくと、左から右に向かって、選択された画像の拡大版がスライドして表示されていきます(図1)。

|
図1:選択された画像が左から右にスライドして表示される(クリックで拡大) |
サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。
新規プロジェクトの作成
早速サンプルを作っていきましょう。
VS 2010のメニューから「ファイル(F)/新規作成(N)/プロジェクト(P)」を選択します。本稿では開発言語にVisual Basicを用います。次に、「Silverlight アプリケーション」を選択して、「名前(N)」に任意のプロジェクト名を指定します。ここでは「SL4_TransitionEffect_ListBox」という名前を付けています。
次に、画像のファイル名を記録したXMLファイル(リスト1)を追加します。XMLデータはLINQ to XMLで処理するため、「プロジェクト(P)/参照の追加(F)」からSystem.Xml.Linqを追加しておきます。
ソリューションエクスプローラー内にImageというフォルダを作成して、画像も追加しておきます。
リスト1 画像名を記録したXMLファイル、ListBoxに使用(Photo.xml)
ダウンロードされたサンプル・ファイルにはXMLファイルや画像は追加済みです。
Silverlightユーザーコントロール(TransitionEffectListBox.xaml)の作成
VS2010のメニューから「プロジェクト(P)/新しい項目の追加(W)」と選択し、「Silverlightユーザーコントロール」を作成します。「名前(N)」には「TransitionEffectListBox.xaml」と指定し、[追加(A)]ボタンをクリックします(図2)。

|
図2:「TransitionEffectListBox.xaml」という名前のSilverlightユーザーコントロールを作成する(クリックで拡大) |
表示される、TransitionEffectListBox.xamlの要素のWidthに900、Heightに600を指定します。
ListBoxコントロールの設定
まずツールボックスから画像と画像名の一覧を表示する、ListBoxコントロールを配置します。x:Name はListBox1です(図3)。

|
図3:ListBoxコントロールを配置する(クリックで拡大) |
ListBoxには画像と画像名の両方を表示しますので、書き出されるXAMLコードをリスト2のように編集します。
リスト2 編集されたXAMLコード(TransitionEffectListBox.xaml)
01 | (1)<ListBox>要素のテンプレートを定義します。<UserControl.Resources>プロパティ要素内に、 |
02 | <UserControl.Resources> |
03 | <DataTemplate x:Key="ListBoxTemplate"> |
08 | </Grid.RowDefinitions> |
09 | <StackPanel Orientation="Vertical"> |
10 | <Image Width="160" Height="120" Source="{Binding 画像名}" Grid.Row="0"/> |
11 | <TextBlock Text="{Binding タイトル}" FontWeight="Bold" FontSize="14" Foreground="Navy"/> |
15 | </UserControl.Resources> |
17 | と記述し、ListBoxTemplateというキーのテンプレートを定義します。<Grid.RowDefinitions> プロパティ要素内で、<RowDefinition/>要素を2個定義すると、<Grid>要素に適用する2行が定義されます。<StackPanel>要素を記述し、OrientationプロパティにVertical(規定値)を指定します。Verticalが規定値ですので、必ずしも記述する必要はありません。<StackPanel>要素内の要素が垂直方向に表示されます。<StackPanel>要素内に<Image>要素を記述します。Sourceプロパティに{Binding 画像名}と指定します。次に、<TextBlock>要素を記述し、Textプロパティに{Binding タイトル}と指定します。画像が表示された下にタイトルが表示されます。ここで指定した「画像名」や「タイトル」はプログラムコード内のクラスで定義するプロパティ名と同じである必要があります。<Image>要素の、Widthに160、Heightに120を設定します。 |
19 | (2)これらの定義済みListBoxTemplateを、x:NameがListBox1である<ListBox>要素に、 |
20 | ItemTemplate="{StaticResource ListBoxTemplate}" |
21 | のように指定します。StaticResourceは、定義済みのリソースを参照します。 |
23 | <UserControl x:Class="SL4_TransitionEffect_ListBox.TransitionEffectListBox" |
29 | d:DesignHeight="300" d:DesignWidth="400" Width="900" Height="600"> |
30 | <UserControl.Resources>■(1) |
31 | <DataTemplate x:Key="ListBoxTemplate"> |
36 | </Grid.RowDefinitions> |
37 | <StackPanel Orientation="Vertical"> |
38 | <Image Width="160" Height="120" Source="{Binding 画像名}" Grid.Row="0"/> |
39 | <TextBlock Text="{Binding タイトル}" FontWeight="Bold" FontSize="14" Foreground="Navy"/> |
43 | </UserControl.Resources> |
44 | <Grid x:Name="LayoutRoot" Background="White"> |
45 | <ListBox Height="568" HorizontalAlignment="Left" Margin="12,12,0,0" x:Name="ListBox1" VerticalAlignment="Top" Width="214" ItemTemplate="{StaticResource ListBoxTemplate}"/>■(2) |
ソリューションエクスプローラー内から、TransitionEffectListBox.xamlを展開して表示される、 TransitionEffectListBox.xaml.vbをダブルクリックして、リスト3のようにロジックコードを記述します。
ロジックコードを記述する
リスト3 (TransitionEffectListBox.xaml.vb)
01 | XMLをLINQで処理するためのクラスの含まれる、System.Xml.Linq名前空間をインポートします。 |
02 | Imports System.Xml.Linq |
04 | ImageInfoというクラス内に「画像名」と「タイトル」という文字列型のプロパティを定義します。 |
05 | Public Class ImageInfo |
06 | Public Property 画像名 As String |
07 | Public Property タイトル As String |
12 | XElementクラス用オブジェクト変数xmldocをメンバ変数として宣言します。メンバ変数として宣言しておくのは、後ほど、ListBoxがSelectionChangedされた時にもこの変数を使用するからです。 |
13 | Dim xmldoc As XElement |
15 | ■TransitionEffectListBoxユーザーコントロールが読み込まれた時の処理 |
16 | XElement.LoadメソッドでXML文書ファイル(Photo.xml)を読み込みます。 |
17 | 読み込んだXML文書から<画像名>要素を選択するクエリを定義します。 |
18 | ImageInfoクラスの新しいリストとして作成するmyImageInfoを宣言します。 |
19 | クエリ(query)を実行します。クエリコレクション内を変数resultで反復処理しながら、以下の処理を実行します。 |
20 | 取得した画像名(result.Value)から、.jpgの拡張子を除いたタイトルとなる部分を取り出し、変数myTitleに格納しておきます。 |
21 | ImageInfoクラスのプロパティ(「画像名」と「タイトル」)に、XMLの要素 (<画像名>)と変数myTitleの値を指定し、AddメソッドでmyImageInfoオブジェクトに追加していきます。このプロパティの値が、XAML内の<Image>要素のSourceプロパティやTextBlockのTextプロパティにバインドされます。 |
22 | ListBoxコントロールのItemSourceプロパティに、myImageInfoオブジェクトを指定します。 |
23 | これで、ListBoxに、画像とタイトル名の追加された画像の一覧が表示されます。 |
24 | Private Sub TransitionEffectListBox_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded |
25 | xmldoc = XElement.Load("Photo.xml") |
26 | Dim query = From c In xmldoc.Descendants("画像名") Select c |
27 | Dim myImageInfo As New List(Of ImageInfo) |
28 | For Each result In query |
29 | Dim titleLen As Integer = Len(result.Value) - 4 |
30 | Dim myTitle = Microsoft.VisualBasic.Left(result.Value, titleLen) |
32 | .Add(New ImageInfo With {.画像名 = "Image/" & result.Value, .タイトル = myTitle}) |
34 | ListBox1.ItemsSource = myImageInfo |