使用复选框创建 WPF Windows 资源管理器树视图

Posted

技术标签:

【中文标题】使用复选框创建 WPF Windows 资源管理器树视图【英文标题】:Create WPF windows explorer tree view with checkbox 【发布时间】:2021-09-04 05:01:08 【问题描述】:

我正在尝试创建一个 WPF Windows 资源管理器树视图文件浏览器,其中包含用于选择多个文件的复选框。复选框应仅查看文件。 像这样 enter image description here

我在 WPF 方面没有太多经验,我很难开始。

谢谢。

【问题讨论】:

您好,您可以查看此答案,并根据您的需要进行自定义:***.com/a/18751667/12655548 我已经根据这个例子 medium.com/@mikependon/… 创建了树视图。但是如何为文件添加复选框并获取选定的文件? 这能回答你的问题吗? Customizing the TreeView to allow multi select 好像作者找到了一些其他的源代码作为例子 【参考方案1】:

我会给你一个最简单的想法,关于如何实现它。考虑两个类FolderFile(为了示例的方便,我实现了自己的简单类):

public class Folder

    public List<Folder> Folders  get; set;  = new();

    public List<File> Files  get; set;  = new();


    public override string ToString() => Name;
    public string Name  get; set; 


public class File

    public string Name  get; set; 
    
    public override string ToString() => Name;

你会有这种MultiselectTreeView 实现:

public class MultiSelectTree: TreeView

    public List<File> SelectedFiles  get; set;  = new();
    
    public void AddItem(object item)
    
        if (item is Folder folder)
        
            var root = FormFolderTreeItem(folder);
            Items.Add(root);
        

        if (item is File file)
        
            var f = FormFileTreeItem(file);
            Items.Add(f);
        
    

    private TreeViewItem FormFolderTreeItem(Folder folder)
    
        var treeItem = new TreeViewItem  Header = folder ;

        foreach (var subFolderItem in folder.Folders.Select(FormFolderTreeItem))
        
            treeItem.Items.Add(subFolderItem);
        

        foreach (var file in folder.Files.Select(FormFileTreeItem))
        
            treeItem.Items.Add(file);
        
        
        return treeItem;
    
    
    private TreeViewItem FormFileTreeItem(File file)
    
        var treeItem = new TreeViewItem ();
        // wrap Files in a checkbox and set this checkbox as a content of a TreeViewItem
        var checkBox = new CheckBox  Content = file ;
        treeItem.Header = checkBox;
        
        // Subscribe for the checked event
        // When the event triggers - add file to the SelectedFiles
        checkBox.Checked += (sender, args) =>
        
            if (sender is CheckBox chb)
            
                SelectedFiles.Add((File)chb.Content);
            
            args.Handled = true;
        ;
        
        // Just the opposite here
        checkBox.Unchecked += (sender, args) =>
        
            if (sender is CheckBox chb)
            
                SelectedFiles.Remove((File)chb.Content);
            
            args.Handled = true;
        ;

        return treeItem;
    

然后您可以使用SelectedFiles 属性访问您选择的文件。

这里是用法示例(Tree是MultiSelectTree的实例):

var firstRoot = new Folder  Name = "Root" ;
var secondRoot = new Folder Name = "Second Root";
        
firstRoot.Folders.Add(new Folder  Name = "Sub folder");
        
secondRoot.Files.AddRange(new []

     new File Name = "First file" ,
     new File Name = "Second file" 
);
        
Tree.AddItem(firstRoot);
Tree.AddItem(secondRoot);

结果你会得到这个:TreeView with checkboxes and multiselect

现在你必须弄清楚如何调整你已经在Designing a WPF TreeView File Explorer中使用的示例

【讨论】:

您好,感谢您的帮助。我从你的例子中学到了一些东西,我用另一种方式做到了。您的方法无法应用于我的树查看器。我添加了复选框 并传递了相关值。

以上是关于使用复选框创建 WPF Windows 资源管理器树视图的主要内容,如果未能解决你的问题,请参考以下文章

WPF的Windows资源管理器控件?

WPF实现Windows资源管理器(附源码)

LIstView 键盘导航类似于 WPF 中的 Windows 资源管理器

WPF:将虚拟文件拖放到 Windows 资源管理器中

如何从 WPF 应用程序中打开 Windows 资源管理器到某个目录?

我想使用 WPF 在滚动查看器控件中创建一个复选框数组