65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 文件列表视图和组合框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (8投票s)

2011年3月12日

CPOL

2分钟阅读

viewsIcon

58888

downloadIcon

2066

本文介绍了一个简单的文件夹导航控件。

引言

现在有很多文件列表视图或文件系统导航控件。大多数都编写得类似于 Windows 资源管理器。我需要在应用程序中使用一个小型且简单的控件。它应该显示在工作区左侧的窄列中,并允许用户打开当前工作目录或其附近的文件夹中的文件。要求是:

  • 控件应该占用非常少的水平空间,请参见屏幕截图。
  • 控件应尽可能轻量级,并且不会过多地占用用户界面。
  • 它应该绑定到最近使用的 (MRU) 文件列表,并允许用户跳转到这些文件的位置。
  • 不应该是资源管理器的克隆,并且不允许用户执行诸如复制、重命名文件等 Shell 操作。如果您正在寻找资源管理器的克隆,您可以在这里找到一个优秀的。

这是嵌入到更大的 UI 中的结果,仅显示了其中的一部分

这是更详细地查看组合框下拉列表

底部的三个文件夹是从应用程序的 MRU 列表中提取的。这些项目的完整路径未显示,但在鼠标悬停时会在工具提示中显示。

使用代码

下载上述.zip文件,并将对.dll的引用添加到您的项目中。以下代码段说明了如何使用该控件

<Window ...
        xmlns:FLV="clr-namespace:FileListView;assembly=FileListView"
        ... >
    ...
    <FLV:FolderView Filter="*.tex|*.txt|*.exe|*.*" 
            RecentLocations="{Binding RecentFiles}"
            OnFileOpen="folderView_OnFileOpen/>
    ...

这里,RecentFiles是您的 MRU 列表。该控件从此列表中提取目录,并自动删除重复项。当用户通过双击或按回车键选择文件时,将触发OnFileOpen事件。以下附加属性可用:

CurrentFolder 当前显示的文件夹。
FilterIndex 当前选定的过滤器。
ShowFolders 打开/关闭文件夹的显示。
ShowHidden 打开/关闭隐藏文件的显示。
ShowIcons 打开/关闭文件和文件夹图标的显示。

实现细节

实现文件列表视图或多或少是一项标准任务,关于代码我只需要评论几点。一是,我试图保持一切精简,并在可能的情况下坚持使用板载 C# 工具。(最终库只有 31 KB 小。)一个例外是使用 Shell 例程提取关联的文件和文件夹图标。另一个可以大大加快较大文件夹显示速度的技巧是延迟查询与文件关联的图标,如下所示

private ImageSource _DisplayIcon = null;
public ImageSource DisplayIcon
{
    get
    {
        if (_DisplayIcon == null)
        {
            try
            {
                if (type == FSItemType.Folder)
                    _DisplayIcon = IconExtractor.GetFolderIcon(FullPath).ToImageSource();
                else
                    _DisplayIcon = IconExtractor.GetFileIcon(FullPath).ToImageSource();

            }
            catch (Exception e)
            { 
                
            }
        }

        return _DisplayIcon;
    }

    set { _DisplayIcon = value; }
}

同样,组合框下拉列表仅在用户实际将其下拉时才构建。

链接

在之前的版本中,我使用了(略作修改的)代码。 Microsoft 已发布一个非常好的 Shell 控件和例程集合,此处

历史

  • 03/12/2011:重写了图标提取例程,以便也获取关联的文件夹图标。修复了列表视图列宽的问题。
  • 03/28/2011:将列表视图实现为一个单独的控件。使用了来自这里AutoGrayImage类。
© . All rights reserved.