如果我在菜单树的不同区域运行代码,我只得到一个元素,你将如何首先将此逻辑应用于此菜单树的所有子组件,然后说明整个树。
我的代码只显示了每个应用区域的 1 个阶段
MessageBox.Show((ToolStripMenuItem).ToString());
所以上面只会显示文件或保存或打开,而不是文件打开或文件保存。
我应该在我的工具条菜单中使用 foreach 吗?
如果我在菜单树的不同区域运行代码,我只得到一个元素,你将如何首先将此逻辑应用于此菜单树的所有子组件,然后说明整个树。
我的代码只显示了每个应用区域的 1 个阶段
MessageBox.Show((ToolStripMenuItem).ToString());
所以上面只会显示文件或保存或打开,而不是文件打开或文件保存。
我应该在我的工具条菜单中使用 foreach 吗?
假设我有MenuStrip
带有子项的ToolStripMenuItem
命名fileToolStripMenuItem
(带有文本File
)New
和Open
. 此外,Open
有From file
和Recent
。要访问 all File
(ToolStripMenuItems
它是孩子),您需要递归方法,它贯穿所有级别(访问孩子,孙子......)
private IEnumerable<ToolStripMenuItem> GetChildToolStripItems(ToolStripMenuItem parent)
{
if (parent.HasDropDownItems)
{
foreach (ToolStripMenuItem child in parent.DropDownItems)
{
yield return child;
foreach (var nextLevel in GetChildToolStripItems(child))
{
yield return nextLevel;
}
}
}
}
此方法采用第一级菜单项并返回IEnumberable<ToolStripMenuItem>
sou,然后您可以遍历它(获取名称、更改某些属性等)。
像这样使用它:
var list = GetChildToolStripItems(fileToolStripMenuItem);
在我的示例中,这将返回子项的集合,如下所示New, Open, From File, Recent
:
您可以轻松浏览集合并获取项目的文本(显示在 中MessageBox
,如下所示:
MessageBox.Show(string.Join(", ", list.Select(x=>x.Text).ToArray()))
或者,如果您愿意,可以这样:
foreach (ToolStripMenuItem menuItem in list)
{
MessageBox.Show(string.Format("item named: {0}, with text: {1}", menuItem.Name, menuItem.Text));
}
编辑:在我看到评论说 OP 的想法是从 获取所有项目MenuStrip
之后,这里有一个例子。
我编写了附加方法,该方法以MenuStrip
参数为参数,遍历所有ToolStripMenuItems
并为每个项目调用GetChildToolStripItems
方法。返回所有顶级项目以及所有子项和孙子的列表...
private List<ToolStripMenuItem> GetAllMenuStripItems(MenuStrip menu)
{
List<ToolStripMenuItem> collection = new List<ToolStripMenuItem>();
foreach (ToolStripMenuItem item in menu.Items)
{
collection.Add(item);
collection.AddRange(GetChildToolStripItems(item));
}
return collection;
}
用法:
var allItems = GetAllMenuStripItems(menuStrip1)
希望这可以帮助。
最后,我使用了围绕以下语法的逻辑,然后在最后构建字符串
ToolStripMenuItem ThisMenuItem = (ToolStripMenuItem)sender;
string WhatClicked = ThisMenuItem.ToString();
ToolStripMenuItem ThisMenuItemOwnerItem = (ToolStripMenuItem)(ThisMenuItem.GetCurrentParent() as ToolStripDropDown).OwnerItem;
然后你显然可以更深入
ToolStripMenuItem ThisOwnersOwnerItem = (ToolStripMenuItem)(ThisMenuItemOwnerItem.GetCurrentParent() as ToolStripDropDown).OwnerItem;
等等添加检查以避免空异常。