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

本文关键字:有系统 驱动器 WPF 浏览器 文件夹 | 更新日期: 2023-09-27 17:50:05

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

我所遵循的文档是:

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

我想在树视图中列出系统中的所有驱动器,而不是只有一个。

<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,那么我所有的其他代码都将被破坏。

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

关于如何使这个列表所有驱动器的任何建议将是非常有帮助的。

首先,我们需要一个新类,命名为"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)。我假设我们只是想要硬盘驱动器,所以我们检查驱动器类型为"固定"。如果我们不关心类型,则可以删除此检查。有关此函数的完整参考,请参阅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>

这将给出您想要的输出。如果我需要更正或可以澄清任何事情,请告诉我!

相关文章: