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