使用WPF创建类似于Windows资源管理器的GUI

时间:2008-10-08 19:41:50

标签: .net wpf user-interface

如何在Windows资源管理器中实现类似于“我的电脑”视图的GUI?

特别是“图标”视图模式。包括不同项目类型的分组(作为存储在此计算机/硬盘驱动器上的文件/带有可移动存储组的设备在Windows资源管理器中)

在WinForms中我会使用ListView这个东西,但在WPF中,唯一能够接近的是带有自定义ControlTemplate的列表框,但似乎太费劲了!

4 个答案:

答案 0 :(得分:2)

为FileSystem类定义了HeirarchichalDataTemplate的TreeView

答案 1 :(得分:1)

这是很多打字(约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>

可能存在一些漏洞,但这是一个良好的开端。

答案 2 :(得分:0)

请参阅Shell MegaPack.WPF

中的FolderView,FileView等控件

它支持分组和图标模式(在许多其他事情中)。

答案 3 :(得分:0)