ToolStripButton文本在ContextMenuStrip中被截断

3

我正在实例化自己的 ToolStripButton 并将其添加到 ContextMenuStrip 中。它弹出来了,但文本被截断了:

string[] layouts = new string[]{"Test 1", "Test 2", "Test 3"};
List<ToolStripButton> items = new List<ToolStripButton>();
foreach (string layout in layouts)
{
    ToolStripButton item = new ToolStripButton(layout, image, LayoutClicked);
    item.AutoSize = true;
    items.Add(item);
}
layoutMenus.Items.Clear();
layoutMenus.Items.AddRange(items.ToArray());
layoutMenus.Show(Cursor.Position.X, Cursor.Position.Y);

任何想法为什么当 AutoSize 属性为 true 时文本会被截断?

1
在我的情况下,我可以用 ToolStripMenuItem 替换 ToolStripButton 来解决这个问题。 - Micha Wiedenmann
6个回答

4

很奇怪,我可以重现这个问题...一个真正的怪异之处(对我来说)是设置菜单的 .Width 可以解决它...但将其设置为任何值(似乎完全忽略该值):

layoutMenus.Width = 800; // could be 20, or 100 and would appear the same

试试看是否有效。即使它没有实际意义,对我来说仍然有效。

甚至:

layoutMenus.Width++;
layoutMenus.Width--;

留出足够的空间,但是

layoutMenus.Width = layoutMenus.Width;

不做任何更改(很可能是为了检查非更改并忽略上面的任何副作用)。


1
对我来说,为了使动态菜单项修改起作用,我需要使用Chin Lin的评论和你的代码:menuItem.AutoSize = false; menuItem.AutoSize = true; menuItem.Width++; - Starwave

3
在之前已经工作的上下文菜单实现中进行了一些重构后,我一直面临着同样的问题。像 @PeteBaughman 一样,我无法通过更改 ContextMenuStrip.Width 来解决这个问题 - 宽度实际上没有改变(也没有指定 ContextMenuStrip.MaximumSize(0,0))。
像 Pete 建议的那样添加一个不可见的项解决了问题。经过更多的实验,我发现了另一个解决方法:调用 ContextMenuStrip.PerformLayout() 可以得到预期的行为。
(在添加项目之前和之后调用 SuspendLayoutResumeLayout 并没有起作用。)

更新: 真正的问题可能是将一个 ToolStripButton 添加到 ContextMenuStrip 中,这通常会在这种情况下创建一个 ToolStripMenuItem

contextMenuStrip.Items.Add("Hello world"); // Returns a ToolStripMenuItem

我创建正确类型的项目后,可以省略调用PerformLayout()

2
两年后,我遇到了同样的问题。我没有设置MaxSize,也无法通过触摸Width属性来解决。我的ContextMenuStrip只包含一个项目 - 一个灰色的按钮,上面写着“不支持”。它被缩短为“不支持”。
最终,我不得不在ContextMenuStrip末尾添加一个虚拟项目,并将其可见性设置为False。然后,ContextMenuStrip就足够宽,可以显示我真正关心的第一个项目。
链接在这里:这里

添加虚拟项对我有用。必须设置“dummy.Width”。所有下拉列表项将具有相同的宽度。 - Boogier

1

我有类似的问题。我想在菜单项列表中添加复选框。为此,我需要将复选框添加到ToolStripControlHost,然后将ToolStripControlHost添加到ToolStripMenuItem对象中。最后一个复选框的名称总是被截断了3个字符。我的解决方法是切换最后一项主机的AutoSize属性,如下所示:

Dim chkbox As System.Windows.Forms.CheckBox = New System.Windows.Forms.CheckBox()
chkbox.Text = "xxxxx"
Dim tshost As ToolStripControlHost = New ToolStripControlHost(chkbox)
tsmiAssemblySpecificTools.DropDownItems.Add(tshost)
                    tshost.AutoSize = False
                    tshost.AutoSize = True

在将宿主项目添加到列表后,必须执行AutoSize切换。

关闭并重新开启自动调整大小功能确实有所帮助,但它仅适用于第一次渲染。如果我稍后更新上下文菜单项,并应用相同的修复方法,则无效。 - Starwave

1
为了更详细地描述症状:在我的情况下,问题似乎只会在上下文菜单中只有一个项目时出现。有多个项目时,宽度似乎会正确设置。
调用ContextMenuStrip.PerformLayout修复了我的问题。

1

我有同样的问题。尝试了所有这些方法,结果发现MaxSize被错误地设置为(200, 0)。将其重置为(0,0)即可解决问题。


你是指 ContextMenuStrip.MaximumSize 吗? - CodeFox

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