4

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

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

4

2 回答 2

10

用于&&显示单个&

编辑:对不起,我错过了你问题的第二部分:(

当你设置它时,你总是可以string.Replace("&", "&&")在文本上使用,但这看起来很乱。

另一种选择是继承ToolStripMenuItem并覆盖 Text 属性的 Set 以替换&&&. 这会好一点,因为它会将代码保持在一个位置。

于 2009-07-13T13:35:02.840 回答
2

不幸的是,我认为没有任何内置支持(如控件的UseMnemonic属性)。Button一种方法是创建一个蛮力方法,该方法将遍历表单上的控件树,并对找到的所有 ToolStripMenuItems 执行替换:

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);
            }
        }                
    }
}

当然,如果菜单结构不是在表单的生命周期中动态建立的,并且偶尔建立起来,这主要是有用的。如果不时添加新项目,那么您可能需要通过某种方法运行它们,该方法将对单个项目执行与符号加倍。

于 2009-07-13T14:01:47.750 回答