【问题标题】:Can I create a multiple-column context menu in .NET Windows Forms?我可以在 .NET Windows 窗体中创建多列上下文菜单吗?
【发布时间】:2012-02-08 15:03:42
【问题描述】:

我想创建一个包含多列的上下文菜单。基本上是这样的:

First item  | [common option] | All Options >
Second item | [common option] | All Options >
Third item  | [common option] | All Options >
Fourth item | [common option] | All Options >

所以基本上有一堆项目(在运行时生成),每个项目都可以自己启动;或使用常用选项;或者您可以获得包含所有可能选项的子菜单。

我该怎么做?我试图滥用ContextMenuStripContextMenu,但他们似乎没有任何这样的选择。我似乎仍然记得在某处看到过多列菜单......

我更喜欢 Windows 窗体解决方案,因为我没有任何 WPF 经验。哦,当单击通知区域(又名系统托盘)中的图标时,此上下文菜单将打开。

【问题讨论】:

    标签: .net winforms contextmenu


    【解决方案1】:

    我不知道 ContextMenuStrip,它是一个完全用 .NET 代码构建的菜单,但您绝对可以使用 ContextMenu 来做到这一点,它是原生系统菜单的包装器。

    关键是为各个菜单项设置MFT_MENUBREAKMFT_MENUBARBREAK 标志,它们分别作为MenuItem class 包装器中的属性公开:MenuItem.BreakMenuItem.BarBreak

    前者只是将菜单项放在一个新列中,而后者将项放在一个新列中并用蚀刻的垂直线分隔列。

    来自 MSDN 示例:

    public void CreateMyMenus()
    {
        // Create three top-level menu items.
        MenuItem menuItem1 = new MenuItem("&File");
        MenuItem menuItem2 = new MenuItem("&New");
        MenuItem menuItem3 = new MenuItem("&Open");
    
        // Set the BarBreak property to display horizontally.
        menuItem2.BarBreak = true;
        menuItem3.BarBreak = true;
    
        // Add menuItem2 and menuItem3 to the menuItem1's list of menu items.
        menuItem1.MenuItems.Add(menuItem2);
        menuItem1.MenuItems.Add(menuItem3);
    }
    

    【讨论】:

      【解决方案2】:

      WinForms 中的菜单只能像树一样构建:您可以在每个项目下有一个子菜单。所以你可以把常用选项作为子菜单的第一项。

      除非您设计自己的控件,否则它看起来不会有任何不同(然后 WPF 更适合此任务,但 WPF 需要大量时间来学习)。

      【讨论】:

      • 嗯,这很好,但我不能安排我的树的第一层,使其分 3 列布局吗?这 3 个项目不需要相互关联(除了放置位置)。
      • 当然可以。本机 Win32 菜单很好地支持这一点。现在,它是否是好的 UI 设计还有待商榷,但你当然不必使用 WPF。这是我在这里经常看到的逃避回答。人们不想想要使用 WPF 有 很多 充分的理由。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2021-02-07
      • 1970-01-01
      • 2012-09-11
      • 2011-06-09
      • 1970-01-01
      相关资源
      最近更新 更多