从基础构造函数中将MenuStripItem注入派生类

时间:2017-09-02 20:27:04

标签: c# constructor load menustrip

我想从基础构造函数中注入一个 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 
{

}

为什么我使用已显示的事件?这是因为在控件中找不到 MenuStrip ,直到呈现或加载它为止。

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

正如你在那里看到的那样:

menu options duplicated

因此我更改了以下内容:

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

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

那么,我该怎么办?

0 个答案:

没有答案