我想从基础构造函数中注入一个 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 ,直到呈现或加载它为止。
好吧,我现在的主要问题是菜单选项创建了两次而不是一次。
正如你在那里看到的那样:
因此我更改了以下内容:
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。
那么,我该怎么办?