【问题标题】:Menu in Winforms resembling folder explorer menuWinforms 中的菜单类似于文件夹资源管理器菜单
【发布时间】:2011-07-18 15:31:25
【问题描述】:

如何在 winforms 中创建一个菜单,该菜单与我们浏览任何文件夹时出现在 Windows 资源管理器的左侧框架中的菜单完全相似。菜单包含树节点和根节点,通过单击 + 和 - 符号出现和消失。

【问题讨论】:

标签: c# winforms menu treeview root


【解决方案1】:

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

您需要 P/Invoke 调用SetWindowTheme 传递树的窗口句柄并使用“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 控件。

【讨论】:

  • 先生,它给出以下错误---:'menu_resembling_windows_menu.newmenu.CreateHandle()':找不到合适的方法来覆盖
【解决方案2】:

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

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

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

【讨论】:

  • 如何制作Root 1的子节点-like ChildRoot1
  • TreeNode tn = new TreeNode("Root 1"); tn.Children.Add(new TreeNode("ChildRoot1"); treeView.Nodes.add(tn); //etc, etc
  • 错了,那就是:tn.Nodes.Add(new TreeNode("ChildRoot1"));
  • .Add 方法的不同重载...如果您想要多个具有自己的孩子的孩子,您可以添加单独的节点,如果您只想要文本,您可以这样做。
  • 同理:TreeNode tn = new TreeNode("节点名称"); TreeNode otherTn = new TreeNode("另一个节点"); TreeNode yetAnotherTn = new TreeNode("又一个节点"); //依此类推,依此类推 otherTn.Nodes.Add(yetAnotherTn); tn.Nodes.Add(otherTn); (编辑:主啊,那个代码 mini-markdown 的东西是如何为 cmets 工作的?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多