C# Winforms中的“文件夹资源管理器”菜单

C# Winforms中的“文件夹资源管理器”菜单,c#,winforms,menu,treeview,root,C#,Winforms,Menu,Treeview,Root,如何在winforms中创建一个菜单,当我们浏览任何文件夹时,它完全类似于Windows资源管理器左侧框架上显示的菜单。该菜单包含树节点和根节点,通过单击+&-符号可显示和消失这些节点 WinForms树视图中可以有多个“根”节点: treeView.Nodes.Add("Root 1"); treeView.Nodes.Add("Root 2"); 它们可以是带子节点的完整节点,而不是上面的文本。这不是菜单,而是树状视图。您可以使用WinForms树状图,但开箱即用的树状图与资源管理器的树状

如何在winforms中创建一个菜单,当我们浏览任何文件夹时,它完全类似于Windows资源管理器左侧框架上显示的菜单。该菜单包含树节点和根节点,通过单击+&-符号可显示和消失这些节点

WinForms树视图中可以有多个“根”节点:

treeView.Nodes.Add("Root 1");
treeView.Nodes.Add("Root 2");

它们可以是带子节点的完整节点,而不是上面的文本。

这不是菜单,而是树状视图。您可以使用WinForms树状图,但开箱即用的树状图与资源管理器的树状图并不完全相同。您需要应用资源管理器窗口主题

您需要p/Invoke来调用传递树的窗口句柄并使用“explorer”作为主题

将以下代码粘贴到项目中的新类中,编译并使用此自定义控件,而不是内置的
TreeView
控件

public class NativeTreeView : System.Windows.Forms.TreeView
{
    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
    private extern static int SetWindowTheme(
        IntPtr hWnd, 
        string pszSubAppName,
        string pszSubIdList
    );

    protected override void CreateHandle()
    {
        base.CreateHandle();
        SetWindowTheme(this.Handle, "explorer", null);
    }
}

请注意,对于
ListView
控件,此技巧的工作方式也完全相同。

不确定,但请检查如何使根1的子节点类似于ChildRoot1TreeNode tn=new TreeNode(“根1”);tn.Children.Add(new-TreeNode(“ChildRoot1”);treeView.Nodes.Add(tn);//等等,让它成为:tn.Nodes.Add(new-TreeNode(“ChildRoot1”);不同的.Add方法重载……如果你想让多个孩子拥有他们自己的孩子,你应该添加单独的节点,如果你只想要文本,你可以这样做。同样的方法:TreeNode tn=new-TreeNode(“Node name”);TreeNode otherTn=new TreeNode(“另一个节点”);TreeNode yetAnotherTn=new TreeNode(“又一个节点”);//诸如此类,诸如此类,otherTn.Nodes.Add(yetAnotherTn);tn.Nodes.Add(otherTn);(编辑:上帝,代码小标记是如何用于注释的?)先生,它给出了以下错误---:“menu\u\u windows\u menu.newmenu.CreateHandle()”:找不到合适的方法来重写
public class NativeTreeView : System.Windows.Forms.TreeView
{
    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
    private extern static int SetWindowTheme(
        IntPtr hWnd, 
        string pszSubAppName,
        string pszSubIdList
    );

    protected override void CreateHandle()
    {
        base.CreateHandle();
        SetWindowTheme(this.Handle, "explorer", null);
    }
}