簡體   English   中英

從 wpf 中的文件路徑列表填充樹視圖

[英]populate treeview from list of file paths in wpf

有幾個示例說明如何從文件路徑集合中填充樹視圖,例如示例或示例。 我似乎無法為 WPF 找到這樣的示例。 我知道我可以集成 Windows 窗體並使用不同的控件以使其工作,但如果我可以使用 wpf 樹視圖控件做同樣的事情,那就太好了。 我要構建的樹視圖由大約 50,000 個文件組成,因此我認為將它綁定到某些東西會更好。 但首先在綁定它之前,我認為基於字符串列表(字符串包含文件的路徑)構造一個會很有幫助。

我對這個問題很感興趣,就把它放在一起。 作為第一次通過,我認為我非常接近您正在尋找的內容。 不過,談論 50,000 個項目讓我認為延遲加載可能是合適的。 無論如何,這是基於 Josh Smith 的文章的簡單版本。 我把所有的代碼都放在這里了,但神奇的是數據模板真的發生了。

給定幾個類來表示我們正在使用的對象......

using System.Collections.Generic;

namespace WpfTreeViewBinding.Model
{
    public class Item
    {
        public string Name { get; set; }
        public string Path { get; set; }
    }
}

和...

namespace WpfTreeViewBinding.Model
{
    public class FileItem : Item
    {

    }
}

和...

namespace WpfTreeViewBinding.Model
{
    public class DirectoryItem : Item
    {
        public List<Item> Items { get; set; }

        public DirectoryItem()
        {
            Items = new List<Item>();
        }
    }
}

我創建了一個遞歸方法來加載一些目錄/文件......

using System.Collections.Generic;
using System.IO;
using WpfTreeViewBinding.Model;

namespace WpfTreeViewBinding
{
    public class ItemProvider
    {
        public List<Item> GetItems(string path)
        {
            var items = new List<Item>();

            var dirInfo = new DirectoryInfo(path);

            foreach(var directory in dirInfo.GetDirectories())
            {
                var item = new DirectoryItem
                               {
                                   Name = directory.Name,
                                   Path = directory.FullName,
                                   Items = GetItems(directory.FullName)
                               };

                items.Add(item);
            }

            foreach(var file in dirInfo.GetFiles())
            {
                var item = new FileItem
                               {
                                   Name = file.Name, 
                                   Path = file.FullName
                               };

                items.Add(item);
            }

            return items;
        }
    }
}

從那里只是獲取數據的問題......

using System.Windows;

namespace WpfTreeViewBinding
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var itemProvider = new ItemProvider();

            var items = itemProvider.GetItems("C:\\Temp");

            DataContext = items;
        }
    }
}

並顯示它...

<Window x:Class="WpfTreeViewBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:Model="clr-namespace:WpfTreeViewBinding.Model" 
        Title="MainWindow" 
        Height="350" Width="525">

    <Window.Resources>

        <HierarchicalDataTemplate DataType="{x:Type Model:DirectoryItem}"
                                  ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" />
        </HierarchicalDataTemplate>

        <DataTemplate DataType="{x:Type Model:FileItem}">
            <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" />
        </DataTemplate>

    </Window.Resources>

    <Grid Margin="8">
        <TreeView ItemsSource="{Binding}" />
    </Grid>

</Window>

所有的魔法都發生在數據模板上。 我想整個事情的關鍵是將 HierarchicalDataTemplate 用於任何具有層次結構的項目(即目錄)。

注意 1:我沒有對此進行廣泛的測試。 它尚未針對性能進行分析。 不過,我歡迎任何反饋,因為這是我很久以前嘗試解決並放棄的問題。 謝謝!

注意 2:您需要將硬編碼路徑設置為對您的系統有意義的內容。

這是顯示不同級別的目錄和文件的屏幕截圖...

在此處輸入圖像描述

先前解決方案的小擴展:我添加了 xaml 代碼以支持圖標,並支持在打開和關閉文件夾的圖標之間切換:

 <HierarchicalDataTemplate DataType="{x:Type viewModels:SourceControlDirecoryViewModel}"
                                  ItemsSource="{Binding Items}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="5" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image Width="16"
                       Height="16"
                       Source="{StaticResource ImageSourceFolderClosed16x16}"
                       x:Name="img" />
                <TextBlock Text="{Binding Path=Name}"
                           ToolTip="{Binding Path=Path}"
                           Grid.Column="2" />
            </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsExpanded, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeViewItem}}}"
                             Value="True">
                    <Setter Property="Source"
                            TargetName="img"
                            Value="{StaticResource ImageSourceFolderOpened16x16}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </HierarchicalDataTemplate>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM