雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

Windows Phone SDK 8.0 に於ける ListBox の扱いについて

Windows Phone SDK 8.0 Advent Calendar 2012 3 日目です。
10 月末に Windows Phone SDK 8.0 (以下、 WP8SDK )がリリースされたものの、なかなか時間が取れなくて細かいところまで見れていないのが現状だったりします。
# 時間がない最大の理由が DQ X なので弁明のしようもありませんが。 ^^;
とは云え、いきなりリタイアするわけにもいきませんし、まずは基本的なところとして Windows Phone SDK 7.5 (以下、 WP7SDK )から変更のあったコントロールを確認する記事を書こうとしたのですが、個人的にタイトルの件だけでおなかいっぱいになってしまったので、この一件のみで記事化する事にしました。
# まぁ、結果的に軽めな記事に収まったので良しと。。。
# 序盤から濃いネタばかりだと Advent Calendar 的に後半きついですし。 ^^;

そもそもの話 in WP7SDK

WP7SDK では、リスト状のデータを表示する際に多くの人が標準コントロールである ListBox コントロールを利用していたかと思います。
# 実際には、パフォーマンスの問題で ListBox を使用しないケースは多々あった様ですが。
# 少なくとも私は結構利用していました。
一方で、 Silverlight for Windows Phone Toolkit (現在は Windows Phone Toolkit )には LongListSelector コントロールがあり、グループ化されたリストを表示する用途で利用されていました。
# 個人的には LongListSelector は非アスキー文字の処理が微妙であまり利用出来ていませんでしたが。。。

LongListSelector in WP8SDK

WP8SDK で最初に感動した事はテンプレートに Panorama / Pivot アプリケーションがあった事でしたが、二番目に感動した事が LongListSelector が標準コントロール入りしていた事でした。
# もちろん Unicode への対応状況は気になるところですが、仮に問題があったとしても標準コントロールであれば正式なルートで改善要望を出す事が出来ますから。
さて、晴れて LongListSelector が標準コントロール入りしたので、リスト表示方法がひとつ増えた、と思ったらそこに大きな罠が潜んでいました。。。

ListBox (on Windows Phone) is dead...?

そもそも LongListSelector にはフラットモードがあるので、通常のリスト表示も LongListSelector で賄う事は可能です。
そして、 LongListSelector にはパフォーマンス対策も組み込まれています。
……となると、まぁ ListBox 不要って意見が出てくる事は十分想像出来る事ではあるんですが、どうやら Microsoft 的にもそう云う結論に至ったのか、 Windows Phone 8.0 アプリケーションのプロジェクトでは Visual Studio / Expression Blend のツールボックスから ListBox が外されてしまいました。
但し、コントロール自体がなくなったわけではない( WP8SDK でも変わらず System.Windows アセンブリ内の System.Windows.Controls 名前空間に ListBox は存在している)ので、 XAML で直接 ListBox 指定すれば利用可能です。
# 尤も、 Web でこの件について検索する限り、 WP8SDK では ListBox の代わりに LongListSelector を使うべきと云う感じではありますが。

WP7SDK で ListBox を利用しているアプリケーションの WP8SDK へのマイグレーション方法

手っ取り早いやり方

手軽に WP8SDK で動く様にしたい場合は、何もせずそのまま使い続ければ良いと思います。
# 実際、 Visual Studio 2012 Express for Windows Phone で Windows Phone OS 7.5 アプリケーションを Windows Phone 8.0 にアップグレードした場合はそのまま ListBox が使用されます。
# ……と云うか、恐らくこのために残されているんだろうと思います。 ^^;;

LongListSelector に差し替える

今後を見据えると、 ListBox は LongListSelector に差し替えるべきかと思います。
単純な ListBox であれば、コントロールの置き換えのみで OK です。

  • on WP7SDK (ListBox)
<ListBox x:Name="list" ItemsSource="{Binding Items}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        <TextBlock Text="{Binding ItemTitle}"/>
        <TextBlock Text="{Binding ItemComment}"/>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>
  • on WP8SDK (LongListSelector)
<phone:LongListSelector x:Name="list" ItemsSource="{Binding Items}">
  <phone:LongListSelector.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        <TextBlock Text="{Binding ItemTitle}"/>
        <TextBlock Text="{Binding ItemComment}"/>
      </StackPanel>
    </DataTemplate>
  </phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>

とっても簡単ですね♪