ファイラーその3
ListBoxからListViewに変えてみる。
MainWindow.xaml
<Window x:Class="filer.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:IO="clr-namespace:System.IO;assembly=mscorlib" Title="Filer" Height="350" Width="525"> <Window.Resources> <Style TargetType="ListViewItem"> <EventSetter Event="MouseDoubleClick" Handler="listBoxItem_DoubleClick"/> </Style> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <TextBox Grid.Column="0" Name="currentFolder" Text="{Binding Path=Path}" /> <Button Grid.Column="1" Name="goParent" Width="30" Content=".." Click="goParent_Click" Cursor="Hand"/> </Grid> <ScrollViewer Grid.Row="1" > <ListView ItemsSource="{Binding Path=Files}" AlternationCount="2"> <ListView.View> <GridView> <GridView.Columns> <GridViewColumn Header="Name"> <GridViewColumn.CellTemplate> <DataTemplate> <Label Content="{Binding Path=Name}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Size"> <GridViewColumn.CellTemplate> <DataTemplate> <Label Content="{Binding Path=Length}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView.Columns> </GridView> </ListView.View> </ListView> </ScrollViewer> </Grid> </Window>
ListBoxをListViewに変更して、中のGridViewにカラムを2つ作った。
さらにDataTemplateをWindow.ResourcesからGridViewColumn.CellTemplateに移動した。
DataTypeとColumn番号からDataTemplateを選択する方法を模索したのだが、
CellTemplateSelectorを書く方法しか見つからなかったのでなるべくxamlだけで済ます方針から見送った。
右寄せにする
Styleで伸ばしてから
<Style TargetType="ListViewItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> </Style>
DataTemplateで右に寄せる
<DataTemplate> <Label Content="{Binding Path=Length}" HorizontalAlignment="Right"/> </DataTemplate>
スタイルをResourcesからListViewの下に移動する
<ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}" > <Setter Property="HorizontalContentAlignment" Value="Stretch" /> <EventSetter Event="MouseDoubleClick" Handler="listBoxItem_DoubleClick"/> </Style> </ListView.ItemContainerStyle>
FileSystemInfoのラッパを作ってLengthプロパティアクセス時にエラーが出ないようにする
DirectoryInfo.Lengthにアクセスしたとき、そんなプロパティは無いというエラーが出る。
ObservableCollection
class Item { public bool IsDirectory { set; get; } public FileSystemInfo Info { set; get; } public String Name { get { return Info.Name; } } public String Length { get { var file = Info as FileInfo; if (file == null) { return ""; } else { return file.Length.ToString(); } } } };