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)
toprotected 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
{
}