Winforms 更改ToolStripMenuItem的大小
我正在自定义在Winforms 更改ToolStripMenuItem的大小,winforms,menustrip,ownerdrawn,Winforms,Menustrip,Ownerdrawn,我正在自定义在MenuStrip中绘制菜单项。我遇到的问题是,菜单项坚持根据文本调整大小,这不是我想要的(没有文本)。我可以将AutoSize设置为false并显式指定大小,但包含菜单(ToolStripDropDown)仍然根据文本调整自身大小,这导致它太小,无法包含整个菜单项 是否有一种简单的方法来设置菜单项的大小?中的此评论解释了我的问题的性质: 虽然可以处理ToolStripMenuItem的绘制事件,但ToolStripMenuItem并不打算为“所有者绘制”。如果要处理特定工具条项目
MenuStrip
中绘制菜单项。我遇到的问题是,菜单项坚持根据文本调整大小,这不是我想要的(没有文本)。我可以将AutoSize
设置为false并显式指定大小,但包含菜单(ToolStripDropDown
)仍然根据文本调整自身大小,这导致它太小,无法包含整个菜单项
是否有一种简单的方法来设置菜单项的大小?中的此评论解释了我的问题的性质:
虽然可以处理ToolStripMenuItem的绘制事件,但ToolStripMenuItem并不打算为“所有者绘制”。如果要处理特定工具条项目的图形,建议使用创建自己的ToolStripItem派生类型的方法。有关示例,请参见[^]
更新:根据您的评论。我不能说太多,因为虽然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的原因是,这似乎是菜单中显而易见的选择,我并不认为控件会拒绝您指定它的大小。作为最合适的体系结构控件,它有其优点和缺点。我经常遇到的问题是,它不能使简单的事情变得简单。设置最小尺寸可能是一项实际的工作,但我宁愿使用我确定的“正确”解决方案。