画像が削除された時、逆の動きを与えて画像が並び替わる
次に紹介するのは、ListBoxに表示されている画像の一覧から、任意の画像を選択すると、その画像が削除され、逆の動きを与える、BackEaseイージングを伴って画像が並び替わるサンプルです。
実装する機能の動作は次の通りです。
ListBox内の画像一覧から任意の画像を選択して削除すると、逆の動きを伴った動作で画像が並び替わります(図9)。

|
図9: 逆の動きを伴った動作で、画像が並び替わる(クリックで拡大) |
VS 2010のデザイン画面上で、コントロールをレイアウトする
これまでのサンプル作成時と同様の手順で、新規Silverlight 4プロジェクト(プロジェクト名は「SL4_FluidMoveBehavior_Remove」)を作成してください。プロジェクトの依存関係も設定してください。
次に、ListBoxに表示させる画像のファイル名を記録したXMLファイル(前掲の、リスト1)を追加します。XMLデータはLINQ to XMLで処理するため、「プロジェクト(P)/参照の追加(F)」からSystem.Xml.Linqを追加しておきます。
ソリューションエクスプローラー内にImageというフォルダを作成して、画像も追加しておきます。
ダウンロードしたサンプル・ファイルにはXMLファイルや画像は追加済みです。
要素のプロパティ内の[レイアウト]を展開して、Widthに800、Heightに600を指定します。次にツールボックスからTextBlockコントロール、ListBoxをレイアウトします。TextBlockコントロールの、Text、FontSize、FontWeightを指定します(図10)。

|
図10: TextBlockとListBoxコントロールをレイアウトした(クリックで拡大) |
書き出されたXAMLコードをリスト4のように編集します。
リスト4: 編集されたXAMLコード(MainPage.xaml)
01 | (1)<ListBox>要素のテンプレートを定義します。<UserControl.Resources>内に、 |
02 | <UserControl.Resources> |
03 | <DataTemplate x:Key="ListBoxTemplate"> |
07 | </Grid.RowDefinitions> |
08 | <Image x:Name="image" Width="160" Height="120" Source="{Binding 画像名}" Margin="5"/> |
12 | と記述し、ListBoxTemplateというキーのテンプレートを定義します。<Grid.RowDefinitions> プロパティ要素内で、<RowDefinition/>要素を定義すると、<Grid>要素に適用する1行が定義されます。<Image>要素を記述します。Sourceプロパティに{Binding 画像名}と指定します。ここで指定した「画像名」はプログラムコード内のクラスで定義するプロパティ名と同じである必要があります。Width、Height、Marginプロパティを設定します。Marginプロパティには5を指定し、画像の周囲に5ピクセルの余白を設けます。 |
14 | (2)<ListBox>要素だけでは、画像は縦1列に並んで表示されてしまいます。そこで、<controlsToolkit:WrapPanel>要素を<ItemsPanelTemplate>要素内に記述します。 |
15 | <ItemsPanelTemplate x:Key="WrapPanelTemplate"> |
16 | <toolkit:WrapPanel Width="753" /> |
18 | のように記述して、WrapPanelTemplateというキーのテンプレートを定義します。 |
20 | (3)これらの定義済みListBoxTemplateとWrapPanelTemplateを、x:NameがListBox1である<ListBox>要素に、 |
21 | ItemsPanel="{StaticResource WrapPanelTemplate}" ItemTemplate="{StaticResource ListBoxTemplate}" |
22 | のように指定します。StaticResourceは、定義済みのリソースを参照します。 |
31 | d:DesignHeight="300" d:DesignWidth="400" Width="800" Height="600"> |
32 | <UserControl.Resources> ■(1) |
33 | <DataTemplate x:Key="ListBoxTemplate"> |
37 | </Grid.RowDefinitions> |
38 | <Image x:Name="image" Width="160" Height="120" Source="{Binding 画像名}" Margin="5"/> |
41 | <ItemsPanelTemplate x:Key="WrapPanelTemplate">■(2) |
42 | <toolkit:WrapPanel Width="753" /> |
44 | </UserControl.Resources> |
45 | <Grid x:Name="LayoutRoot" Background="White"> |
46 | <TextBlock Height="39" HorizontalAlignment="Left" Margin="24,12,0,0" x:Name="TextBlock1" Text="選択した画像が削除されます" VerticalAlignment="Top" Width="464" FontSize="24" FontWeight="Bold" /> |
47 | <ListBox Height="518" HorizontalAlignment="Left" Margin="24,57,0,0" x:Name="ListBox1" VerticalAlignment="Top" Width="753" ItemsPanel="{StaticResource WrapPanelTemplate}" ItemTemplate="{StaticResource ListBoxTemplate}"/>■(3) |
ロジックコードを記述する
次に処理を記述します。
ソリューションエクスプローラー内のMainPage.xamlを展開し、MainPage.xaml.vbをダブルクリックしてコード画面を開きます。
リスト5のようにロジックコードを記述します。
リスト5: ロジックコード(MainPage.xaml.vb)
03 | LINQ to XMLでXMLを処理するクラスの含まれる、System.Xml.Linq名前空間をインポートします。 |
04 | Imports System.Xml.Linq |
06 | ImageInfoクラスを定義し、String型の「画像名」プロパティを定義します。 |
08 | Public Property 画像名 As String |
14 | XElement.LoadメソッドでXML文書ファイル(Photo.xml)を読み込みます。読み込んだXML文書から<画像名>要素のコレクションを取得するクエリ(query)を定義します。ImageInfoオブジェクトのリストとして作成するmyImageInfoを宣言し、クエリ(query)を実行します。クエリコレクション内を変数resultで反覆処理しながら、以下の処理を実行します。 |
15 | Addメソッドで、myImageInfoクラスの各プロパティ(「画像名」)に、XMLの要素(<画像名>)の値を追加します。このプロパティの値が、XAML内のBindingの値にバインドされます。 |
16 | ListBoxコントロールのItemSourceプロパティに、myImageInfoオブジェクトを指定します。 |
17 | これで、ListBoxに画像の一覧が表示されます。 |
18 | Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded |
19 | Dim xmldoc As XElement = XElement.Load("Photo.xml") |
20 | Dim query = From c In xmldoc.Descendants("画像名") Select c |
22 | Dim myImageInfo As New List(Of ImageInfo) |
24 | For Each result In query |
25 | myImageInfo.Add(New ImageInfo With {.画像名 = "Image/" & result.Value}) |
27 | ListBox1.ItemsSource = myImageInfo |
次に、ソリューションエクスプローラー内の、MainPage.xamlを選択し、マウスの右クリックで表示されるメニューの、「Expression Blendを開く(X)」を選択し、Blend4を起動します。