ListView−その1

Win8のListViewとは、iOSのTableViewのことである。
"連絡先"アプリでも使用されている、たくさん行があって、指でフリックするとクルクルとスクロール(kinetic scrollという)をする、あのリストだ。
当然だがこの"ファンシー"なUIは、Windows8/8.1でも存在する。
Windows8/8.1には、さらにGridViewと呼ばれる、似たようなものある。
こちらは文字通り、グリッド上にオブジェクトを配置してグリグリスクロールするものである。
アルバムなどで使われるものだ。
どちらも"モダン"なUIでアプリを作る上で、避けて通れないものだ。


実は、これに昨年12月から着手していたのだが、ドはまりしていたのだ。
理由の一つがこれ。

Standard**ItemTemplateがWindows8.1では廃止

各種書籍やウェッブの紹介資料では、ListViewを使用する際に、"Standard**ItemTemplate"(例えば Standard130ItemTemplate)を使用している。
ところがぎっちょんちょん、これがWindows8.1では使用できず、"could not be resolved"になるのだ。
詳細は、ここにあるが、要は廃止になったのだ。
このため、自分でListView.ItemTemplateを書く必要があるのだ。

では、気を取り直して順番にやっていく。

適当にWindowsストアアプリプロジェクトを作成

Blank Appでよい

ListViewを追加

"MainPage.xaml"に以下を追加する。

<ListView x:Name="listview1" ItemsSource="{Binding}" Width="500" VerticalAlignment="Stretch" HorizontalAlignment="Left" CanReorderItems="True" CanDragItems="True">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Width="500" Height="130">
                <Border Height="110" Width="110" Margin="10,10,0,10">
                    <!--<Image Source="/SampleImage.png" Stretch="UniformToFill"/>-->
                </Border>
                <StackPanel Orientation="Vertical" VerticalAlignment="Top" Margin="0,10,0,0">
                    <TextBlock Text="{Binding Ttile}" Margin="10,0,0,0" Width="350" Height="20" TextTrimming="WordEllipsis" />
                    <TextBlock Text="{Binding Summary}" Margin="10,2,0,0" Width="350" Height="14" TextTrimming="WordEllipsis" HorizontalAlignment="Left" FontSize="9" Opacity="0.49"/>
                    <TextBlock Text="{Binding Body}" Margin="10,2,0,0" Width="350" TextTrimming="WordEllipsis" TextWrapping="Wrap"/>
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

これでListViewが追加される。
ItemsSource="{Binding}"とすることで、表示する各アイテムのソースはC#のソース内で指定(binding)することができる。
また各TextBlockの内容(Text=...で指定している部分)は、そのアイテムのソース内の同名のプロパティとなる。
ちなみにこのListView.ItemTemplateとDataTempleteはここから拝借した。

アイテムになるクラスを追加

"MainPage.xaml.cs"に以下を追加する。


public class testitem
{
public int Number {set; get;}
public string Ttile {set; get;}
public string Summary { set; get; }
public string Body { set; get; }
public testitem()
{
Summary = "this is the test summary.";
Body = "this is the test body.";
}
}
手習い用なので、Summary、Body各プロパティはハードコードだ。
ここで声を大にして注意したいのが、setter/getterの指定だ。
これらのプロパティは表示データとして使用される=MainPageクラスから呼び出されるので、getterの指定が絶対に必要だ。
さもないと、プロパティの内容がListViewに表示されない。
これが分からなかったばかりに、真っ黒なListViewと2か月ほど格闘するはめになった。
本当に要注意だ。

各アイテムの配列を作成

"MainPage.xaml.cs"に以下を追加する。


ObservableCollection testitems;

public MainPage()
{
this.InitializeComponent();
//
testitems = new ObservableCollection();
int count;
testitem item;
//
for (count = 0; count < 10; count++)
{
item = new testitem();
item.Number = count;
item.Ttile = string.Format("Item {0, 0:00}", count);
testitems.Add(item);
}
}

これでtestitemのコレクションであるtestitemsが作成される。
最後に、

ListViewのItemSourceにtestitemsをbinding

"MainPage.xaml.cs"に以下を追加


protected override void OnNavigatedTo(NavigationEventArgs e)
{
listview1.ItemsSource = testitems;
}
これにて2か月の積み残しが、一件落着。