ToolStripButton文本在ContextMenuStrip中被截断

时间:2009-10-11 07:15:10

标签: .net winforms contextmenustrip toolstripbutton

我正在实例化我自己的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,我们知道原因会被切断吗?

6 个答案:

答案 0 :(得分:3)

好奇;我可以重现这个...一个怪异的怪(对我来说)是设置菜单的.Width修复它...但是将设置为任何东西(它似乎完全忽略了这个值) :

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

看看是否有效。这对我来说,即使它没有任何意义。

偶:

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

留下足够的空间,但

layoutMenus.Width = layoutMenus.Width;

没有(大概是检查不变,忽略了上面的副作用)。

答案 1 :(得分:3)

在对以前工作的上下文菜单实现进行一些重构之后,我遇到了同样的问题。就像@PeteBaughman一样,我无法通过更改ContextMenuStrip.Width来解决这个问题 - 事实上宽度没有改变(ContextMenuStrip.MaximumSize也没有改变:(0,0))。

像Pete建议的那样添加一个不可见的项目就可以了。经过几次实验后,我发现了另一种解决方法:对ContextMenuStrip.PerformLayout()的调用导致了预期的行为。

(在添加项目之前和之后调用SuspendLayoutResumeLayout不起作用。)


更新:真正的问题可能是,ToolStripButton被添加到ContextMenuStrip,这通常会在这样调用时创建ToolStripMenuItem:< / p>

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

在创建了正确类型的项目之后,我能够省略对PerformLayout()的调用。

答案 2 :(得分:2)

2年后,我遇到了同样的问题。我没有设置MaxSize,触摸Width属性也没有帮助。我的ContextMenuStrip只包含一个项目 - 一个灰色的按钮,表示“不支持”。它被截断为“Not Supp”。

我最终不得不在ContextMenuStrip的末尾添加一个虚拟项目,并将其可见性设置为False。然后,ContextMenuStrip足够宽,可以显示我真正关心的第一个项目。

链接here

答案 3 :(得分:1)

我有同样的问题。尝试了所有这些事情,结果证明MaxSize是错误设置的,例如(200, 0)。将其重置为(0,0)以解决问题。

答案 4 :(得分:0)

为症状添加更多细节:就我而言,似乎仅在上下文菜单中只有一项时才会出现此问题。如果有多个项目,则宽度设置似乎正确。

然后致电ContextMenuStrip.PerformLayout为我解决了这个问题。

答案 5 :(得分:0)

我有类似的问题。我想在菜单项列表中添加复选框。为此,我需要将复选框添加到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

在将主机项添加到列表之后,必须执行“自动调整大小”切换。