查找 Windows 表单中的所有 ContextMenuStrip

Find all ContextMenuStrips in Windows Form

如何在 Windows 表单中循环遍历所有上下文菜单?

我目前拥有的是:

public void SearchContextMenuStrip(Form Window)
{
    foreach (Control item in Window.Controls)
    {
        if (item is ContextMenuStrip)
        {
            MessageBox.Show("ContextMenuStrip found!", "ContextMenuStrip found");
        }
        else
        {

        }
    }
}

这适用于所有其他控件,但不适用于 ContextMenus。

我希望它能够翻译多语言应用程序的所有文本,所以如果有人知道更好的解决方案,我将不胜感激。

提前致谢!

您可以将 仅关联一个 ContextMenuStrip 到每个控件 所以我认为您需要 ToolStripMenuItem

foreach( var item in Window.ContextMenuStrip.Items)
{
}

使用 resx 文件并为每种区域语言创建带有翻译的文件。使用 settings.NAME 而不是硬编码。将自动应用本地化。

https://msdn.microsoft.com/en-us/library/aa992030(v=vs.100).aspx

我认为最好的解决方案是使用反射并在所有对象之间找到 ContextMenuStrip。此脚本将能够 return 所有 ContextMenuStrip。

    public static bool IsLastObject(object obj)
    {
        if (obj == null) return true;
        Type type = obj.GetType();
        return 
            type.IsArray ||
            type.IsEnum ||
            type.IsPointer ||
            type.IsAbstract ||
            type.IsSealed;
    }

    public static IEnumerable<Control> GetAllControls(object obj, int maxNests = 25)
    {
        if (obj == null || maxNests < 0) yield break;
        Type type = obj.GetType();
        List<Control> list = new List<Control>();
        if (obj is Control)
            foreach (Control item in ((Control)obj).Controls)
            {
                list.Add(item);
                yield return item;
            }
        foreach (var item in type.GetFields())
        {
            var nobj = item.GetValue(obj);
            if (nobj == null) continue;
            if (nobj is Control && !list.Contains((Control)nobj)) yield return (Control)nobj;
            if (IsLastObject(nobj)) continue;
            foreach (var ni in GetAllControls(nobj, maxNests - 1))
                yield return ni;
        }
    }

    public static IEnumerable<ContextMenuStrip> GetAllToolStrips(object control, int maxNests = 25)
    {
        foreach (var item in GetAllControls(control, maxNests))
            if (item is ContextMenuStrip) yield return (ContextMenuStrip)item;
    }

享受...