我有一个ContextMenuStrip
显示可由用户命名的项目;允许用户给包含 & 符号的项目名称。显示时ContextMenuStrip
,项目将 & 符号视为转义序列,并在下一个字符下划线。
在设置项目的成员之前,我可以将所有 & 号加倍Text
,但该成员在代码中的其他地方使用,所以如果可能的话,我想阻止 ContextMenuStrip 专门处理 & 号。有没有办法关闭这种行为?
我有一个ContextMenuStrip
显示可由用户命名的项目;允许用户给包含 & 符号的项目名称。显示时ContextMenuStrip
,项目将 & 符号视为转义序列,并在下一个字符下划线。
在设置项目的成员之前,我可以将所有 & 号加倍Text
,但该成员在代码中的其他地方使用,所以如果可能的话,我想阻止 ContextMenuStrip 专门处理 & 号。有没有办法关闭这种行为?
用于&&
显示单个&
编辑:对不起,我错过了你问题的第二部分:(
当你设置它时,你总是可以string.Replace("&", "&&")
在文本上使用,但这看起来很乱。
另一种选择是继承ToolStripMenuItem
并覆盖 Text 属性的 Set 以替换&
为&&
. 这会好一点,因为它会将代码保持在一个位置。
不幸的是,我认为没有任何内置支持(如控件的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);
}
}
}
}
当然,如果菜单结构不是在表单的生命周期中动态建立的,并且偶尔建立起来,这主要是有用的。如果不时添加新项目,那么您可能需要通过某种方法运行它们,该方法将对单个项目执行与符号加倍。