我已经在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>
如果我在后面的代码中填充树视图,则所有其他代码都将中断.
关于如何使此列表成为所有驱动器的任何建议将非常有帮助.
解决方法:
首先,我们将需要一个新类,称为“ 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()获得系统上的驱动器列表.
然后,我们使用“驱动器”作为我们的迭代变量(MSDN),使用foreach(与示例代码中的for循环具有相同的作用)遍历整个集合.我假设我们只想要硬盘驱动器,所以我们检查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>
这应该为您提供所需的输出.让我知道是否需要进行任何更正或可以澄清任何内容!