从基部构造注入MenuStripItem派生类(Injecting a MenuStripItem

2019-09-29 08:10发布

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

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;
        }
    }
}

和两个孩子的:

public partial class frmMain : LocalizedForm 
{

}

public partial class frmCredentials : LocalizedForm 
{

}

为什么我用的Event? 这是因为的MenuStrip不会在控件中找到,直到它被呈现或加载。

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

正如你可以看到有:

通过这个原因我已经改变了以下几件事:

protected bool HasValidMenu(out MenuStrip menu) ,以protected bool HasValidMenu(string name, out MenuStrip menu)

呼叫已被更改为:

if (HasValidMenu(out menu))if (HasValidMenu(GetType().Name, out menu))

这将返回从那里这被称为主要的类型名称。

和魔术:

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

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

但由于某些原因,显示的事件不会影响到派生类。 我已经测试通过调用使用负载或派生类的Event Application.OpenForms[name] ,但这也为空。

所以,我该怎么办?

文章来源: Injecting a MenuStripItem to a derived class from the base constructor