c# - 文件夹浏览器列出 WPF 中的所有系统驱动器

标签 c# asp.net wpf treeview folderbrowserdialog

我在 WPF 中创建了一个 FOLDER BROWSER 控件,并且工作正常,但我只针对一个驱动器进行了硬编码。

我遵循的文档是:

http://msdn.microsoft.com/en-us/library/bb546972%28v=vs.90%29.aspx

我想让它在 TreeView 中列出系统中的所有驱动器,而不是只列出一个。

<Window.Resources>
        <ObjectDataProvider x:Key="RootFolderDataProvider">
            <ObjectDataProvider.ObjectInstance>
                <folderExplorer:FolderExplorer FullPath="e:\" />
            </ObjectDataProvider.ObjectInstance>
        </ObjectDataProvider>

        <HierarchicalDataTemplate
            DataType    = "{x:Type folderExplorer:FolderExplorer}"
            ItemsSource = "{Binding Path=SubFolders}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
    </Window.Resources>

<TreeView Grid.Column="0"
                  Name="RootTreeView"
                  Background="AliceBlue"
                  Foreground="Black" Grid.RowSpan="3" Margin="0,0,0,169">
            <TreeViewItem Header="Browse">
                <TreeViewItem.ItemsSource>
                    <Binding Source="{StaticResource RootFolderDataProvider}">
                        <Binding.Path>SubFolders</Binding.Path>
                    </Binding>
                </TreeViewItem.ItemsSource>
            </TreeViewItem>
        </TreeView>

如果我在后面的代码中填充 TreeView ,我的所有其他代码都会损坏..

关于如何使此列表成为所有驱动器的任何建议都将非常有帮助。

最佳答案

首先,我们需要一个新类,称之为“DriveExplorer”。我保留了链接示例中的“文件夹”名称,您可能需要将 XAML 中的名称替换为“FolderExplorer”。

先上代码:

public class DriveExplorer
{
    private ObservableCollection<Folder> _folders;
    public ObservableCollection<Folder> Folders
    {
        get
        {
            _folders = new ObservableCollection<Folder>();

            DriveInfo[] drives = DriveInfo.GetDrives();
            foreach (DriveInfo drive in drives)
            {
                //We only want drives with folders, "Fixed" is hard drives
                if (drive.DriveType == DriveType.Fixed)
                {
                    Folder newFolder = new Folder();
                    newFolder.FullPath = drive.Name;
                    _folders.Add(newFolder);
                }
            }
        }
    }
}

现在看看它的作用。就像“文件夹”一样,我们声明了一个 ObservableCollection<Folder> 的列表。将我们的“驱动器”存储在其中。出于所有意图和目的,驱动器只是我们以不同方式获得的文件夹。然后,我们使用 DriveInfo.GetDrives() 获取系统上的驱动器列表.

然后我们使用 foreach 迭代整个集合(这与示例代码中的 for 循环做同样的事情),使用“drive”作为我们的迭代变量(MSDN)。我假设我们只需要硬盘驱动器,所以我们检查 DriveType 是否为“Fixed”。如果我们不关心类型,则可以删除此检查。有关此功能的完整引用,请参阅 MSDN .最后,我们创建一个新的“文件夹”,并将路径设置为驱动器盘符,就像您在 XAML 中所做的那样(示例在其构造函数中所做的)。

现在对于 XAML,我们需要一个与您已有的非常相似的数据模板(这是对现有模板的补充):

<HierarchicalDataTemplate
     DataType    = "{x:Type folderExplorer:DriveExplorer}"
     ItemsSource = "{Binding Path=Folders}">
     <TextBlock Text="{Binding Path=Name}" />
 </HierarchicalDataTemplate>

然后我们只需要将数据源更改为“DriveExplorer”:

<ObjectDataProvider x:Key="RootFolderDataProvider">
    <ObjectDataProvider.ObjectInstance>
         <folderExplorer:DriveExplorer />
    </ObjectDataProvider.ObjectInstance>
</ObjectDataProvider>

这应该会为您提供所需的输出。如果我需要进行任何更正或可以澄清任何内容,请告诉我!

关于c# - 文件夹浏览器列出 WPF 中的所有系统驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22375801/

相关文章:

c# - 在 C# 中初始化静态字段以用于枚举模式

c# - 无法确定函数的接口(interface)签名

c# - 可描述为字符串的 HttpRequest

c# - 使用 MVVM 通过 ViewModel 属性冒泡 INotifyPropertyChanged 事件的好方法是什么?

c# - 隐藏 ItemsControl 中的最后一项

c# - 复选框内容内的列表框 - WPF

c# - 调用 this() 构造函数和不同的 base() 构造函数

c# - 快速生成 ASP.Net 页面的工具,用于编辑数据库表-字典和主从相关表

c# - 如何将字符串数组转换为 C# 中的类型

WPF - 使超链接可点击