更改 ToolStripMenuItem 的大小

5
我正在自定义绘制MenuStrip中的菜单项。我遇到的问题是菜单项坚持根据文本大小调整自身大小,而这不是我想要的(没有文本)。我可以将AutoSize设置为false并明确指定大小,但包含菜单的菜单(ToolStripDropDown)仍然基于文本大小调整自身大小,这会导致它太小而无法容纳整个菜单项。
有没有一种简单直接的方法来设置菜单项的大小?

为什么没有文字?听起来像是一个糟糕的用户界面设计。 - siride
3
并不一定。菜单中可能有一些概念是有用的,但不需要文字,比如投票按钮或滑块。这取决于上下文。我不会仅因为这个原因就否定设计。 - Jeff Yates
@Jeff Yates:我认为在菜单中放置滑块不是一个好主意。它应该放在表单或工具栏中等等。 - siride
1
@siride:这完全取决于上下文。单独使用时,可能不是一个好主意 - 但在正确的上下文中使用,它可能是唯一的好主意。 - Jeff Yates
2
@siride,有点过于笼统和假设了。这是在工具栏中的ToolStripDropDownButton。在下拉菜单中,我想要绘制一张图片来代替文本,就像自定义绘制组合框项一样。一张图片胜过千言万语(而且更容易看)。 - snarf
3个回答

5

可以通过在 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);
    }
}

我在你的代码中发现了几个错误。首先,你没有关闭"new ToolStripMenuItem()"的括号。其次,没有与ToolStripMenuItem(string, Bitmap)匹配的构造函数。第三,btnId从未声明,或者你没有解释它是什么。 - undefined

1

这篇CodeProject上的文章中的评论解释了我的问题的本质:

虽然你可以处理ToolStripMenuItem的Paint事件,但是ToolStripMenuItem并不打算被“自定义绘制”。如果你想处理特定工具栏项的绘制,推荐的方法是创建自己的ToolStripItem派生类型。请参见ToolStripItem Class[^]以获取示例。


1
  1. 你可以通过使用空格设置菜单项的宽度(而不是高度),然后在空白处使用OnPaint进行绘制
  2. 如果您需要将图片放入下拉菜单中,为什么不使用ToolStripMenuItem?例如,您可以使用嵌入图像的ToolStripControlHost放置。不要忘记,您可以使用LayoutStyleLayoutSettings属性更改下拉菜单的布局(例如从堆栈布局到表格布局)
  3. 您不仅可以为菜单项指定大小,还可以为其所在的下拉菜单指定大小。例如,当下拉菜单打开时(通过OnOpening、Opening、DropDownOpending等方式进行反应),您可以使用ToolStripDropDown.MinimumSize属性设置最小宽度(或高度,或两者兼有)。

总的来说,ToolStrip是WinForms命名空间中最合适的架构控件。它具有几乎无限的可能性并且非常可扩展。

更新:根据您的评论,我不能说太多,因为虽然ToolStrip是最有架构的,但也被很好地注释了,许多特定的事情需要被发现。我仍然在我的答案中添加了#3,但许多东西只能通过尝试和使用Reflector来发现。


1
对于(1),使用空格设置大小远非理想。对于(2),请参见我的答案。我宁愿派生自己的ToolStripItem类,而不是使用ToolStripControlHost,该类仅绘制图片。我选择使用ToolStripMenuItem的原因是因为在菜单中似乎是显而易见的选择,而且我并没有真正考虑控件会拒绝让您指定其大小。至于是否是最适当架构的控件,嗯,它有其优缺点。我一直遇到的问题是它不能使简单的事情变得简单。 - snarf
设置最小尺寸可能是一个实用的解决方法,但我更愿意使用我已经确定的“正确”解决方案。 - snarf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接