如何在Windows资源管理器中实现类似于"我的电脑"视图的GUI?
特别是"图标"视图模式。包括不同项目类型的分组(如存储在此计算机上的文件/硬盘驱动器/Windows资源管理器中具有可移动存储组的设备)
在WinForms中,我会使用ListView来完成这件事,但在WPF中,唯一接近的是一个带有自定义ControlTemplate的列表框,但这似乎太费力了!
使用为您的FileSystem类定义的HeirarchichalDataTemplate创建TreeView
这需要大量的打字(大约50行),但当你完成基本功能时,你可以很容易地做一些事情,比如更改项目显示或为组添加扩展/折叠功能,这里有一个例子(使用扩展/折叠,只是为了好玩):
首先我们的数据对象:
public class Item
{
public string Type { get; set; }
public string Name { get; set; }
public ImageSource Icon { get; set; }
}
在代码中创建它们,并将它们的列表设置为以下窗口的DataContext:
<Window x:Class="ListViewTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" Name="W">
<Window.Resources>
<CollectionViewSource x:Key="Items" Source="{Binding}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Type"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<DataTemplate x:Key="ItemTemplate">
<Grid Width="128">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="12"/>
</Grid.RowDefinitions>
<Image Source="{Binding Icon}"/>
<TextBlock Text="{Binding Name}" Grid.Row="1"/>
</Grid>
</DataTemplate>
<ItemsPanelTemplate x:Key="ItemPanel">
<WrapPanel Orientation="Horizontal" Width="{Binding ElementName=W, Path=ActualWidth}"/>
</ItemsPanelTemplate>
<DataTemplate x:Key="HeaderTemplate">
<StackPanel Margin="0 15">
<TextBlock Text="{Binding Name}"/>
<Rectangle Height="1" Fill="Blue"/>
</StackPanel>
</DataTemplate>
<Style x:Key="ContainerStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander Header="{Binding Name}" IsExpanded="True">
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<ListBox
ItemsSource="{Binding Source={StaticResource Items}}"
ItemTemplate="{StaticResource ItemTemplate}"
ItemsPanel="{StaticResource ItemPanel}">
<ListBox.GroupStyle>
<GroupStyle
HeaderTemplate="{StaticResource HeaderTemplate}"
ContainerStyle="{StaticResource ContainerStyle}"/>
</ListBox.GroupStyle>
</ListBox>
</Grid>
</Window>
那里可能有一些错误,但这是一个良好的开端。
查看Shell MegaPack.WPF 中的FolderView、FileView等控件
它支持分组和图标模式(以及许多其他功能)。
查看Windows API代码包:http://archive.msdn.microsoft.com/WindowsAPICodePack
还有FolderView和FileView:http://visualstudiogallery.msdn.microsoft.com/E544A5BA-49EF-469D-B926-6DF9E55D9D64/和http://visualstudiogallery.msdn.microsoft.com/0850E431-344D-4464-96A4-695D9A93E4A6/