TransitionEffectを使う、特殊効果を伴ったコントロールの表示(前編)

2011年4月19日(火)
PROJECT KySS

ロジックコードを記述する

リスト5 (TransitionEffectElementShow.xaml.vb)

Option Strict On

XMLをLINQで処理するためのクラスの含まれる、System.Xml.Linq名前空間をインポートします。
Imports System.Xml.Linq
ImageInfoというクラス内に「画像名」という文字列型のプロパティを定義します。
Public Class ImageInfo
  Property 画像名 As String
End Class
~コード略~

■TransitionEffectElementShowユーザーコントロールが読み込まれた時の処理
ListBoxに画像の一覧を表示する、ImageShowプロシージャを実行します。
  Private Sub TransitionEffectElementShow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    ImageShow()
  End Sub

■ListBoxに画像の一覧を表示する処理
XElement.LoadメソッドでXML文書ファイル(Photo.xml)を読み込みます。
読み込んだXML文書から<画像名>要素を選択するクエリを定義します。
ImageInfoクラスの新しいリストとして作成するmyImageInfoを宣言します。
クエリ(imageQuery)を実行します。クエリコレクション内を変数resultで反復処理しながら以下の処理を実行します。
Addメソッドで、ImageInfoクラスのプロパティ(「画像名」)に、XMLの要素 (<画像名>)の値を追加します。このプロパティの値が、XAML内の<Image>要素のSourceプロパティにバインドされます。
Image_ListBoxコントロールのItemSourceプロパティに、myImageInfoオブジェクトを指定します。
これで、ListBoxに画像の一覧が複数行に渡って表示されます。

  Private Sub ImageShow()
      Dim xmldoc3 As XElement = XElement.Load("Photo.xml")
    Dim imageQuery = From c In xmldoc3.Descendants("画像名") Select c
    Dim myImageInfo As New List(Of ImageInfo)
    For Each result In imageQuery
      myImageInfo.Add(New ImageInfo With {.画像名 = "Image/" & result.Value})
    Next
    Image_ListBox.ItemsSource = myImageInfo
  End Sub
~コード略~

TransitionEffectElementShowユーザーコントロールの動作確認

TransitionEffectElementShowユーザーコントロールに配置したListBoxに、画像の一覧が表示されるかどうかを確認します。VS2010メニューの「デバッグ(D)/デバッグ開始(S)」では、MainPage.xamlの内容が実行され、TransitionEffectElementShow.xamlは実行されません。そこで、動作確認のために、MainPage.xaml内にTransitionEffectElementShow.xamlを取り込んでおきます。MainPage.xamlの、要素のWidthに800、Heightに600と指定しておきます。

まずlocalという名前空間を、MainPage.xaml内の要素内で定義します。xmlns:local=””と入力すると、名前空間の値の一覧が表示されますので、現在作成しているプロジェクト名を選択します(図4)。

図4:localという名前空間を定義する(クリックで拡大)

次に、要素内に

図5:要素内にTransitionEffectElementShow を取り込む
  <Grid x:Name="LayoutRoot" Background="White">
    <local:TransitionEffectElementShow/>
  </Grid>

のように記述します。するとデザイン画面内にListBoxコントロールに画像が取り込まれて表示されます。表示されない場合は、「ソリューションのビルド」を実行してみてください。それでも表示されない場合は、コードが間違っているということですので、確認します。

「デバッグ(D)/デバッグ開始(S)」で実行して動作を確認しておきましょう。

これでListBoxの設定は一応完了です、次にTransitionEffectElementShow.xaml内にDataPagerとDataGridコントロールを配置します。そこで、先にTransitionEffectElementShow.xaml内に配置した、ListBoxコントロールのOpacityプロパティに0を指定して透明化しておきます。透明化しても画面上では薄いグレーの枠線は表示されたままになります。

DataPagerとDataGridコントロールの設定

DataPagerとDataGridコントロールはStackPanelコントロールの子要素として配置します。各コントロールのx:Nameは図6を参照してください。StackPanelコントロールを配置し、OrientationプロパティにVertical(デフォルト)を指定します。その中にツールボックスからDataPagerとDataGridコントロールをドラッグ&ドロップします(図6)。

図6:StackPanelコントロール内にDataPagerとDataGridコントロールを配置する(クリックで拡大)

書き出されるコードはリスト6のようになります。

リスト6 書き出されたコード(TransitionEffectElementShow.xaml)

(1)<StackPanel> 要素内に<sdk:DataPager>と<sdk:DataGrid>要素が記述されています。<StackPanel>要素のOrientationプロパティは、デフォルトのVerticalを指定しているため記述はされていません。
<Canvas x:Name="LayoutRoot" Background="White">
  <ListBox Height="443" HorizontalAlignment="Left" x:Name="Image_ListBox" VerticalAlignment="Top" Width="647" ItemsPanel="{StaticResource WrapPanelListBox}" ItemTemplate="{StaticResource ListBoxItemTemplate}" Opacity="0" />
  <StackPanel Height="441" HorizontalAlignment="Left"  x:Name="DataGrid_StackPanel" VerticalAlignment="Top" Width="644">■(1)
    <sdk:DataPager Height="34" x:Name="DataPager1" PageSize="5" Width="570"/>
    <sdk:DataGrid AutoGenerateColumns="False" Height="359" x:Name="PersonalInfo_DataGrid" Width="571" />
  </StackPanel>
</Canvas>

次にDataGridを選択し、プロパティの[共通]内のColumnsの横にある[…]ボタンをクリックします。「コレクションエディター」が起動しますので、「項目の選択(S)」からDataGridTextColumnを選択し、[追加(A)]ボタンで4個追加します。追加したDataGridTextColumnの、[共通]を展開して表示されるHeaderプロパティに、DataGridTextColumnの上から順番に「氏名、年齢、住所、勤務先」と指定します(図7)。

図7:「コレクションエディター」からDataGridTextColumnを追加し、Headerプロパティを設定した(クリックで拡大)

図8のようにDataGridコントロールにヘッダが表示されます。書き出されるXAMLには不要なプロパティが追加されますので、最終的にはBindingプロパティを指定して、リスト7のようなコードにしてください。Bindingプロパティに指定する名称は、VBコード内のクラス内で定義するプロパティ名と同じである必要があります。

図8:DataGridコントロールにヘッダが表示された(クリックで拡大)

リスト7 書き出され編集したXAMLコード(TransitionEffectElementShow.xaml)

(1)<sdk:DataGridTextColumn>要素のBindingプロパティに、「氏名、年齢、住所、勤務先」を指定します。これらは手動で設定しています。
<Canvas x:Name="LayoutRoot" Background="White">
  <ListBox Height="443" HorizontalAlignment="Left" x:Name="Image_ListBox" VerticalAlignment="Top" Width="647" ItemsPanel="{StaticResource WrapPanelListBox}" ItemTemplate="{StaticResource ListBoxItemTemplate}" Opacity="0" />
  <StackPanel Height="441" HorizontalAlignment="Left" x:Name="DataGrid_StackPanel" VerticalAlignment="Top" Width="644">
    <sdk:DataPager Height="34" x:Name="DataPager1" PageSize="5" Width="570"/>
    <sdk:DataGrid AutoGenerateColumns="False" Height="359" x:Name="PersonalInfo_DataGrid" Width="571">
      <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn  CanUserSort="True" Header="氏名" Width="Auto" Binding="{Binding 氏名}"/>■(1)
        <sdk:DataGridTextColumn  CanUserSort="True" Header="年齢" Width="Auto" Binding="{Binding 年齢}"/>■(1)
        <sdk:DataGridTextColumn  CanUserSort="True" Header="住所" Width="Auto" Binding="{Binding 住所}"/>■(1)
        <sdk:DataGridTextColumn  CanUserSort="True" Header="勤務先" Width="Auto" Binding="{Binding 勤務先}"/>■(1)
      </sdk:DataGrid.Columns>
    </sdk:DataGrid>
  </StackPanel>
</Canvas>

DataGridコントロールを選択し、HeightプロパティにAutoを指定します。デザイン画面上ではヘッダだけのDataGridが表示されます。

  • 「TransitionEffectを使う、特殊効果を伴ったコントロールの表示(前編)」サンプルプログラム

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています