如何停止ContextMenuStrip中的项目特别处理&符号?

时间:2009-07-13 13:33:13

标签: c# winforms contextmenustrip

我有ContextMenuStrip,显示可由用户命名的项目;允许用户提供包含&符号的项目名称。当显示ContextMenuStrip时,项目'将&符号视为转义序列,并为下一个字符加下划线。

在设置项目Text成员之前,我可以将所有&符号加倍,但该成员在代码的其他地方使用,所以如果可能的话,我想停止ContextMenuStrip特别处理&符号。有没有办法扭转这种行为?

2 个答案:

答案 0 :(得分:9)

使用&&显示单个&

修改抱歉,我错过了你问题的第二部分:(

您可以在设置文本时始终使用string.Replace("&", "&&"),但这看起来很混乱。

另一种替代方法是从ToolStripMenuItem继承并覆盖文本属性的Set以将&替换为&&。这会更好一些,因为它会将代码保留在一次。

答案 1 :(得分:1)

遗憾的是,我认为没有任何内置支持(如UseMnemonic控件的Button属性)。一种方法是创建一个暴力方法,它将在窗体上移动控制树并对找到的所有ToolStripMenuItem执行替换:

public TheForm()
{

    InitializeComponent();
    FixAmpersands(this.Controls);
}

private static void FixAmpersands(Control.ControlCollection controls)
{
    foreach (Control control in controls)
    {
        if (control is ToolStrip)
        {
            FixAmpersands((control as ToolStrip).Items);
        }
        if (control.Controls.Count > 0)
        {
            FixAmpersands(control.Controls);
        }
    }
}

private static void FixAmpersands(ToolStripItemCollection toolStripItems)
{
    foreach (ToolStripItem item in toolStripItems)
    {
        if (item is ToolStripMenuItem)
        {
            ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
            tsmi.Text = tsmi.Text.Replace("&", "&&");
            if (tsmi.DropDownItems.Count > 0)
            {
                FixAmpersands(tsmi.DropDownItems);
            }
        }                
    }
}

当然,如果菜单结构不是在表单的生命周期中动态构建的,那么这当然是有用的。如果偶尔添加新项目,您可能需要通过一些方法运行它们,这些方法将对单个项目执行&符号加倍。