我有ContextMenuStrip
,显示可由用户命名的项目;允许用户提供包含&符号的项目名称。当显示ContextMenuStrip
时,项目'将&符号视为转义序列,并为下一个字符加下划线。
在设置项目Text
成员之前,我可以将所有&符号加倍,但该成员在代码的其他地方使用,所以如果可能的话,我想停止ContextMenuStrip特别处理&符号。有没有办法扭转这种行为?
答案 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);
}
}
}
}
当然,如果菜单结构不是在表单的生命周期中动态构建的,那么这当然是有用的。如果偶尔添加新项目,您可能需要通过一些方法运行它们,这些方法将对单个项目执行&符号加倍。