使用 ToString 捕获整个 ToolStripMenu 树
Capturing whole ToolStripMenu tree with ToString
如果我 运行 我的菜单树的不同区域的代码,我只得到一个元素,你如何首先将这个逻辑应用到这个菜单树的所有子组件,其次,说明整个树.
我的代码只显示了每个应用区域的 1 个阶段
MessageBox.Show((ToolStripMenuItem).ToString());
所以上面只会显示文件或保存或打开,而不是文件打开或文件保存。
我应该将 foreach 与我的 toolstripmenuitems 一起使用吗?
假设我有 MenuStrip
和 ToolStripMenuItem
命名为 fileToolStripMenuItem
(文本 File
),它有子项 New
和 Open
。此外,Open
有 From file
和 Recent
。要访问所有 File
的 ToolStripMenuItems
(它是 children),您需要递归方法,它遍历所有级别(访问 children、grandchildren。 ..)
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;
}
}
}
}
此方法采用一级菜单项和 returns IEnumerable<ToolStripMenuItem>
,因此您可以遍历它(获取名称、更改一些 属性 等)。
这样使用:
var list = GetChildToolStripItems(fileToolStripMenuItem);
在我的示例中,这将 return 您 collection 个子项,如下所示:New, Open, From File, Recent
.
您可以轻松浏览 collection 并获取项目的文本(显示在 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
方法。 Returns 所有顶级项目的列表以及所有 children 和 grand children...
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;
等等添加检查以避免空异常。
如果我 运行 我的菜单树的不同区域的代码,我只得到一个元素,你如何首先将这个逻辑应用到这个菜单树的所有子组件,其次,说明整个树.
我的代码只显示了每个应用区域的 1 个阶段
MessageBox.Show((ToolStripMenuItem).ToString());
所以上面只会显示文件或保存或打开,而不是文件打开或文件保存。
我应该将 foreach 与我的 toolstripmenuitems 一起使用吗?
假设我有 MenuStrip
和 ToolStripMenuItem
命名为 fileToolStripMenuItem
(文本 File
),它有子项 New
和 Open
。此外,Open
有 From file
和 Recent
。要访问所有 File
的 ToolStripMenuItems
(它是 children),您需要递归方法,它遍历所有级别(访问 children、grandchildren。 ..)
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;
}
}
}
}
此方法采用一级菜单项和 returns IEnumerable<ToolStripMenuItem>
,因此您可以遍历它(获取名称、更改一些 属性 等)。
这样使用:
var list = GetChildToolStripItems(fileToolStripMenuItem);
在我的示例中,这将 return 您 collection 个子项,如下所示:New, Open, From File, Recent
.
您可以轻松浏览 collection 并获取项目的文本(显示在 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
方法。 Returns 所有顶级项目的列表以及所有 children 和 grand children...
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;
等等添加检查以避免空异常。