3

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

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

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

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

我应该在我的工具条菜单中使用 foreach 吗?

4

2 回答 2

1

假设我有MenuStrip带有子项的ToolStripMenuItem命名fileToolStripMenuItem(带有文本FileNewOpen. 此外,OpenFrom fileRecent。要访问 all FileToolStripMenuItems它是孩子),您需要递归方法,它贯穿所有级别(访问孩子,孙子......)

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)

希望这可以帮助。

于 2017-03-27T20:36:20.567 回答
0

最后,我使用了围绕以下语法的逻辑,然后在最后构建字符串

ToolStripMenuItem ThisMenuItem = (ToolStripMenuItem)sender;
string WhatClicked = ThisMenuItem.ToString();
ToolStripMenuItem ThisMenuItemOwnerItem = (ToolStripMenuItem)(ThisMenuItem.GetCurrentParent() as ToolStripDropDown).OwnerItem;

然后你显然可以更深入

ToolStripMenuItem ThisOwnersOwnerItem = (ToolStripMenuItem)(ThisMenuItemOwnerItem.GetCurrentParent() as ToolStripDropDown).OwnerItem;

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

于 2021-05-03T10:29:14.797 回答