使用 ToString 捕获整个 ToolStripMenu 树

Capturing whole ToolStripMenu tree with ToString

如果我 运行 我的菜单树的不同区域的代码,我只得到一个元素,你如何首先将这个逻辑应用到这个菜单树的所有子组件,其次,说明整个树.

我的代码只显示了每个应用区域的 1 个阶段

  MessageBox.Show((ToolStripMenuItem).ToString());

所以上面只会显示文件或保存或打开,而不是文件打开或文件保存。

我应该将 foreach 与我的 toolstripmenuitems 一起使用吗?

假设我有 MenuStripToolStripMenuItem 命名为 fileToolStripMenuItem(文本 File),它有子项 NewOpen。此外,OpenFrom fileRecent。要访问所有 FileToolStripMenuItems(它是 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;

等等添加检查以避免空异常。