C# 从基构造函数向派生类注入MenuStripItem

C# 从基构造函数向派生类注入MenuStripItem,c#,constructor,load,menustrip,C#,Constructor,Load,Menustrip,我想注入一个菜单项,或者创建一个新的菜单项,如果它不存在(但这是一个不同的问题),从基本构造函数开始,逻辑如下: public class LocalizedForm : Form { public LocalizedForm() { Shown += (sender, e) => { MenuStrip menu = null; if (HasValidMenu(out menu))

我想注入一个菜单项,或者创建一个新的菜单项,如果它不存在(但这是一个不同的问题),从基本构造函数开始,逻辑如下:

public class LocalizedForm : Form 
{
    public LocalizedForm() 
    {
        Shown += (sender, e) =>
        {
            MenuStrip menu = null;
            if (HasValidMenu(out menu))
                LanguageManager.AttachMenu(menu); //Language Manager will inject MenuStripItems to the passed MenuStrip
        };
    }

    protected bool HasValidMenu(out MenuStrip menu)
    {
        try
        {
            menu = Controls.OfType<MenuStrip>().SingleOrDefault(x => x.Dock == DockStyle.Top);
            return menu != null;
        }
        catch
        {
            menu = null;
            return false;
        }
    }
}
为什么使用显示的事件?这是因为在呈现或加载控件之前,在控件中找不到菜单提示

我现在的主要问题是菜单选项创建了两次而不是一次

如你所见:

因此,我改变了以下几点:

protected bool hasvalidmenus(out MenuStrip menu)
to
protected bool hasvalidmenus(string name,out MenuStrip menu)

呼叫已更改为:

if(hasvalidmanus(out-menu))
if(hasvalidmanus(GetType().Name,out-menu))

这将返回调用它的主类型名

还有魔法:

menu=Controls.OfType().SingleOrDefault(x=>x.Dock==DockStyle.Top)

menu=Application.OpenForms[name].Controls.OfType().SingleOrDefault(x=>x.Dock==DockStyle.Top)

但由于某些原因,显示的事件不影响派生类。我使用
Application.OpenForms[name]
调用派生类的Load或Showed事件进行测试,但这也是空的

那么,我能做什么

public partial class frmMain : LocalizedForm 
{

}

public partial class frmCredentials : LocalizedForm 
{

}