Winforms 更改ToolStripMenuItem的大小

Winforms 更改ToolStripMenuItem的大小,winforms,menustrip,ownerdrawn,Winforms,Menustrip,Ownerdrawn,我正在自定义在MenuStrip中绘制菜单项。我遇到的问题是,菜单项坚持根据文本调整大小,这不是我想要的(没有文本)。我可以将AutoSize设置为false并显式指定大小,但包含菜单(ToolStripDropDown)仍然根据文本调整自身大小,这导致它太小,无法包含整个菜单项 是否有一种简单的方法来设置菜单项的大小?中的此评论解释了我的问题的性质: 虽然可以处理ToolStripMenuItem的绘制事件,但ToolStripMenuItem并不打算为“所有者绘制”。如果要处理特定工具条项目

我正在自定义在
MenuStrip
中绘制菜单项。我遇到的问题是,菜单项坚持根据文本调整大小,这不是我想要的(没有文本)。我可以将
AutoSize
设置为false并显式指定大小,但包含菜单(
ToolStripDropDown
)仍然根据文本调整自身大小,这导致它太小,无法包含整个菜单项

是否有一种简单的方法来设置菜单项的大小?

中的此评论解释了我的问题的性质:

虽然可以处理ToolStripMenuItem的绘制事件,但ToolStripMenuItem并不打算为“所有者绘制”。如果要处理特定工具条项目的图形,建议使用创建自己的ToolStripItem派生类型的方法。有关示例,请参见[^]

  • 可以使用空格设置菜单项的宽度(而不是高度),然后使用OnPaint在空白处绘制
  • 如果需要将图片放入下拉列表,为什么要使用ToolStripMenuItem?例如,可以放置嵌入图像的ToolStripControlHost。不要忘记,您可以通过使用和属性(例如从堆栈到表布局)更改下拉式布局
  • 您不仅可以为菜单项指定大小,还可以为其所在的下拉列表指定大小。例如,当下拉菜单打开时(打开、打开、下拉打开多种反应方式),可以使用ToolStripDropDown.MinimumSize属性设置最小宽度(或高度,或两者兼有)
  • 一般来说,ToolStrip是WinForms命名空间中最合适的体系结构控件。它几乎有无限的可能性和非常可扩展性


    更新:根据您的评论。我不能说太多,因为虽然ToolStrip是最具体系结构的,但它的评论也非常好,而且许多特殊的东西需要被发现。我仍然在我的答案中添加了#3,但许多事情只有通过尝试才能发现,当然也可以通过使用Reflector来发现。

    可以通过向
    toolStripItem
    添加空图像来实现。现在更改图像的大小,为
    ToolStripItem
    提供所需的大小。我在我的项目中做了如下工作:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    
    public partial class Form1 : Form
    {    
        public Form1()
        {
            Bitmap emptyImage = new Bitmap(48, 48);
            ToolStripMenuItem  m_Item = new ToolStripMenuItem(System.Convert.ToString("All       Programs",emptyImage);
            m_Item.ImageAlign = ContentAlignment.MiddleLeft;
            m_Item.ImageScaling = ToolStripItemImageScaling.None;                        
            m_Item.Name = btnId.ToString();
            MenuStrip menu = new MenuStrip();
            menu.Items.Add(m_Item);
        }
    }
    

    为什么没有文本?对我来说,这听起来像是一个糟糕的UI设计。@siride:不一定。在不需要文本(如投票按钮或滑块)的菜单中,有一些概念是有用的。这取决于上下文。我不会仅仅因为这个就放弃这个设计。@Jeff Yates:我不认为菜单中的滑块是个好主意。它应该在窗体上、工具栏上或类似的地方。@siride:这一切都取决于上下文。就其本身而言,这似乎不是一个好主意——但如果在正确的上下文中使用,它可能是唯一的好主意。@siride,有点宽泛和假设。它是工具栏中的ToolStripDropDownButton。在下拉菜单中,我想绘制一个图像来代替文本,就像您可以自定义绘制组合框项目一样。一张图片抵得上千言万语(而且更容易看)。对于(1)来说,使用空格设置大小远非理想。对于第(2)项,请参见我自己的答案。与其使用ToolStripControlHost,我更愿意派生自己的ToolStripItem类来简单地绘制图片。我选择使用ToolStripMenuItem的原因是,这似乎是菜单中显而易见的选择,我并不认为控件会拒绝您指定它的大小。作为最合适的体系结构控件,它有其优点和缺点。我经常遇到的问题是,它不能使简单的事情变得简单。设置最小尺寸可能是一项实际的工作,但我宁愿使用我确定的“正确”解决方案。