Windows 窗体中的标准 Windows 菜单栏

Posted

技术标签:

【中文标题】Windows 窗体中的标准 Windows 菜单栏【英文标题】:Standard Windows menu bars in Windows Forms 【发布时间】:2011-02-16 05:06:04 【问题描述】:

我注意到,在我的表单设计中添加MenuStrip(来自工具箱)并不会像在许多本机 Windows 应用程序中看到的那样生成菜单栏。相反,我得到了一个类似于 Visual Studio 自己的菜单栏。 MenuStrip 的样式设置似乎都没有模仿更常见的本机菜单栏。

有没有一种方法可以将菜单栏添加到我的 Windows 窗体应用程序中,该菜单栏看起来与您在记事本、任务管理器和其他应用程序中看到的一样? (最好与设计师一起,但我也不介意以编程方式添加它。)

说明截图:

【问题讨论】:

它与记事本或 Windows 资源管理器中的菜单有何不同?它与 Office 2003 中的非常相似,因此并不罕见。 【参考方案1】:

我通常将 MenuStrip 的 RenderMode 设置为 System,这提供了一个简约的单色菜单(没有渐变或任何类似的颓废)。

如果这还不够,那么您可能需要跳过一些低级的障碍才能得到您想要的。

【讨论】:

【参考方案2】:

您可以通过设置表单的 Menu 属性来做到这一点,如下所示:

private void Form1_Load(object sender, EventArgs e)

    this.Menu = new MainMenu();
        MenuItem item = new MenuItem("File");
        this.Menu.MenuItems.Add(item);
            item.MenuItems.Add("Save", new EventHandler(Save_Click));
            item.MenuItems.Add("Open", new EventHandler(Open_Click)); 
        item = new MenuItem("Edit");
        this.Menu.MenuItems.Add(item);
            item.MenuItems.Add("Copy", new EventHandler(Copy_Click));
            item.MenuItems.Add("Paste", new EventHandler(Paste_Click)); 
        // etc ...


private void Save_Click(object sender, EventArgs e)

    // save

这些菜单看起来像“普通”系统菜单。

不过,我找不到任何设计师对此的支持。在我的辩护中,我并没有真正努力。

【讨论】:

有一个更简单的解决方案。它可以在“选择项目”对话框中找到。该组件名为“MainMenu”,也支持表单设计器。 这是一个很好的答案。它可能不像使用设计器那样简单或友好,但不值得一票。 我同意。这是一个很好的答案,当我在没有安装 IDE 的计算机上处​​理项目时会派上用场!我刚想投票,但它说问题太旧了,在编辑问题之前我不能投票,对吧? @jts:它已被编辑(因此您可以撤消您的反对票),我接受您的道歉。 :) 不过,我是个笨蛋——我确实查看了“选择项目”对话框,发现里面有 3 个 MainMenu 控件,其中 2 个已经被检查过,尽管我的工具箱中没有一个,所以我很早就放弃了。我尽量不要在午夜之后与 Visual Studio 搏斗。 对不起。不要对自己太苛刻,我们所有人都可能发生:-)【参考方案3】:

转到您的工具箱,右键单击里面的任意位置并选择“选择项目”。

当对话框加载并出现时,向下滚动直到看到 MainMenu。将其添加到工具箱中,您就拥有了一个原生菜单栏!

【讨论】:

哇,我不知道我可以像这样将东西添加到我的工具箱中。非常感谢! 我不知道这个组件。我试了一下,它非常有限:我无法在设计器中更改颜色,不支持本地化,没有图像等。如果这是你想要的,那就去吧. 个原因导致它被 MenuStrip 取代。 是的,是的。我不需要较新的 MenuStrip 的多功能性,所以我愿意接受这样的选择。我也刚刚发现它是一个 .NET Framework 2.0 类。 是的。如果在 MainMenu 中有我喜欢的一件事,那就是在菜单项旁边添加图像的选项... MenuItem 的一些构造函数将Image 作为参数,所以我认为可以添加图像,但不能来自设计器。【参考方案4】:

您可以为MenuStrip 组件创建自己的渲染器,而不是使用MainMenu 组件。这里的优点是能够将图像添加到MenuStripItem 对象。这是自定义渲染器的粘贴箱:

NativeRenderer

可以在渲染器的构造函数中应用不同的主题。全部尝试以查看原生主题。要使用此渲染器,只需将实例设置为 MenuStrip Renderer 属性:

menuStrip.Renderer = new NativeRenderer([theme]);

【讨论】:

哦,这看起来很有用!如果我最终使用它(我有点转向greener pastures),我很想感谢来源。还是在公共领域? :) 抱歉 BoltClock,我已经很久没有潜伏在这里了。我一直在努力寻找原作者(它发布在 code.google.com 的某个地方)。找到原始链接后我会发布。 @BoltClock 我找到了!请把所有的功劳归功于这位天才:code.google.com/p/szotar/source/browse/trunk/Client/… 好像找不到ToolbarTheme类型

以上是关于Windows 窗体中的标准 Windows 菜单栏的主要内容,如果未能解决你的问题,请参考以下文章

是否有从 Windows 窗体中的自定义对话框返回值的标准方法?

Windows 纠错

如何在 Windows 窗体应用程序设置中记录窗口位置

如何自定义Windows窗体的系统菜单?

Windows 窗体中的多级组合框

Windows 窗体工具箱为空