我想注入的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]
,但这也为空。
所以,我该怎么办?