Как мне остановить элементы в ContextMenuStrip от специального лечения амперсандов? - PullRequest
3 голосов
/ 13 июля 2009

У меня есть ContextMenuStrip, который отображает элементы, которые могут быть названы пользователем; пользователю разрешено давать названия предметов, содержащие амперсанды. Когда отображается ContextMenuStrip, элементы обрабатывают амперсанды как escape-последовательности и подчеркивают следующий символ.

Я мог бы удвоить все амперсанды перед тем, как задавать элементы Text элементов, но этот элемент используется в другом месте кода, поэтому, если это возможно, я бы хотел запретить ContextMenuStrip специально обрабатывать амперсанды. Есть ли способ отключить это поведение?

Ответы [ 2 ]

9 голосов
/ 13 июля 2009

используйте && для отображения одного &

Редактировать: Извините, я пропустил вторую часть вашего вопроса: (

Вы всегда можете использовать string.Replace("&", "&&") в тексте, когда устанавливаете его, но это выглядит грязно.

Другой альтернативой может быть наследование от ToolStripMenuItem и переопределение набора свойств текста для замены & на &&. Это было бы немного лучше, так как это позволило бы сохранить код в одном месте.

1 голос
/ 13 июля 2009

Я не думаю, что, к сожалению, есть какая-либо встроенная поддержка для этого (например, свойство 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);
            }
        }                
    }
}

Это, конечно, полезно, прежде всего, если структура меню не создается динамически и иногда в течение срока жизни формы. Если новые элементы добавляются время от времени, вам, вероятно, потребуется выполнить их каким-либо методом, который будет выполнять удвоение амперсанда на одном элементе.

...