我目前正在用C# Visual Studio2017开发一个Windows Form应用程序,并决定使用tutorial seen here实现一个侧面板菜单。
它非常适合在单击子窗体时显示子窗体,但是我想知道如何在子窗体代码中用新的子窗体替换当前的子窗体。即如何访问子窗体代码中的主窗体。
private Form activeForm = null;
private void openChildForm(Form childForm)
{
if (activeForm != null)
activeForm.Close();
activeForm = childForm;
childForm.TopLevel = false;
childForm.FormBorderStyle = FormBorderStyle.None;
childForm.Dock = DockStyle.Fill;
childFormPanel.Controls.Add(childForm);
childFormPanel.Tag = childForm;
childForm.BringToFront();
childForm.Show();
}这就是在主窗体中打开子窗体的方式。如何通过子窗体访问此方法?我相信这可能会让人很困惑,但如果你快速浏览一下视频,你就会明白我的意思。
谢谢!
发布于 2021-01-28 03:59:22
可以使用保留主窗体实例的静态类。当加载主窗体时,在FormController类中设置MainForm静态属性。然后从子窗体调用FormControll.openChildForm(...);
public static FormController{
public static Form MainForm {get;set;}
private static Form activeForm = null;
public static void openChildForm(Form childForm)
{
if (activeForm != null)
activeForm.Close();
activeForm = childForm;
MainForm.childForm.TopLevel = false;
MainForm.childForm.FormBorderStyle = FormBorderStyle.None;
MainForm.childForm.Dock = DockStyle.Fill;
MainForm.childFormPanel.Controls.Add(childForm);
MainForm.childFormPanel.Tag = childForm;
MainForm.childForm.BringToFront();
MainForm.childForm.Show();
}
}然后,在您的子窗体中,您可以调用该静态类来更改窗体。
public class ChildForm{
private void btn_click(...){
FormController.openChildForm(<newChildForm>);
}
}发布于 2021-01-28 03:50:45
您可以使用事件来处理此操作:
步骤1)创建一个从Form继承的新类。这将是您所有孩子的窗体的基类。您可以将此ChildForm (继承自)表单命名为。
步骤2)定义一个新的公共事件,您可以从更改子窗体的函数绑定到该事件。
它可能看起来像这样:
public event EventHandler OnRequestChildChange;步骤3)在您想要请求更改的孩子中,您可以调用以下代码:
OnRequestChildChange?.Invoke(null);//这也会传入您的参数,因此您可以创建一个事件,允许您传入自定义参数并传入窗体的名称或类型,并在事件处理程序中使用switch语句。
步骤4)绑定到main函数中的事件
private ChildForm activeForm = null;
private void openChildForm(ChildForm childForm)
{
if (activeForm != null){
activeForm.OnRequestChildChange -= Child_RequestChange;
activeForm.Close();
}
activeForm = childForm;
activeForm.OnRequestChildChange += Child_RequestChange;
childForm.TopLevel = false;
childForm.FormBorderStyle = FormBorderStyle.None;
childForm.Dock = DockStyle.Fill;
childFormPanel.Controls.Add(childForm);
childFormPanel.Tag = childForm;
childForm.BringToFront();
childForm.Show();
}步骤5)创建事件处理程序'Child_RequestChange‘,它将在子请求时通过创建新实例或拉出所需新窗体的本地实例并调用上面的方法来处理交换窗体。
https://stackoverflow.com/questions/65926195
复制相似问题