我需要从子窗口更改主窗口(mdi 容器)的菜单条带项目文本,
像这样:
文件
-登录
自
文件
-注销
在主窗口中添加以下内容:
public static MainForm Current;
public string FileLogin
{
get { return fileLoginToolStripMenuItem.Text; }
set { fileLoginToolStripMenuItem.Text = value; }
}
显然,使用您为登录/注销菜单项的菜单条项设置或自动设置的名称。 然后在主窗体的窗体构造函数中,设置 当前。
public MainForm()
{
InitializeComponent();
Current = this;
}
然后从另一个窗口/窗体中,您可以调用(设置值):
MainForm.Current.FileLogin = "Logout";
但比这更好的是,你在孩子的窗户上做一个活动,
public event Action UserLoggedIn = delegate { };
在 MainForm 上,让 MainForm 订阅该事件,与上述相反...
ChildForm.Current.UserLoggedIn += () => FileLogin = "Logout";
并让孩子在用户登录时引发事件,UserLoggedIn()
.
其任何子项调用的公共方法添加到 MDI 容器。
假设此方法称为SetLoggedStatus
(在 MDI 容器中)
public void SetLoggedStatus(bool status)
{
ToolStripMenuItem loginMenu = MenuStrip1.Items(0) as ToolStripMenuItem:
loginMenu.DropDownItems[0].Text = (status == true ? "Logout" : "Login");
}
现在,我们需要从 MDI 子窗体调用此公共方法。每个 MDIChild 窗体都有一个指向 MDIParent 的属性我们可以使用该属性将泛型表单实例强制转换为正确的 MDI 父级
(在登录后的MDIChild中,假设MDIParent是一个名为MyParentForm的表单类)
MyParentForm f = this.MDIParent as MyParentForm;
if(f != null)
f.SetLoggedStatus(true);
以下是从 MDI 子级访问主菜单项的方法:
// this button in the child form
private void button1_Click(object sender, EventArgs e) {
ToolStripMenuItem tsm;
// file menu
tsm = (ToolStripMenuItem)this.MdiParent.MainMenuStrip.Items[0];
MessageBox.Show( tsm.DropDownItems[0].Name);
// first menu under File Menu
tsm.DropDownItems[0].BackColor = Color.Red;
// second menu under File Menu
tsm.DropDownItems[1].BackColor = Color.Wheat;
}
您可以以相同的方式更改字体或文本;您可以使用.text
代替背景颜色。