功能要求:
有两个窗口类,分别是StartUpWnd类以及Form1类,需要在StartUpWnd界面中点击“”运行“按钮”进入Form1界面,同时需要在Form1界面上点击“主界面”按钮重新调出“主界面”。
解决方案:
第一个功能非常基本,因为程序运行时出现的就是“主界面”,对其中的“运行”按钮响应的事件中加入调出Form1的代码即可,不再赘述。重点是功能2,如何在子界面中调出父窗口呢?要是在Qt中用信号槽的方式也很简单,但由于初学C#,所以我前期采用的是比较笨的方法,具体实现方案是:在父窗口中建一个一直在线的定时器,当子窗口中点击了“主界面”按钮后将其一个成员变量置位,父窗口中的定时器一直在判断该成员变量的值,若需要显示,则显示主界面。
这个方法可以实现功能但是...非常不科学。
在学习了C#中委托和事件之后,我意识到这可以用事件的方式完成。
①在子窗口Form1中声明事件:
/// <summary>
/// 创建事件收到打开主界面的委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void OnRecievedHandler(object sender, EventArgs e);
/// <summary>
/// 点击“主界面”按钮将引发此事件
/// </summary>
public event OnRecievedHandler ToShowMainPage;
②在子窗口Form1中发出事件:
private void UI_B_MAINPAGE_Click(object sender, EventArgs e)
{
ToShowMainPage(this, e);
}
③在父窗口类StartUpWnd中将事件与响应函数连起来:
public StartUpWnd()
{
InitializeComponent();
///将事件与响应函数连接起来:
form1.ToShowMainPage += new Form1.OnRecievedHandler(my_OnRecieved);
}
/// <summary>
/// 事件响应函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void my_OnRecieved(object sender, EventArgs e)
{
if (this.IsHandleCreated)
{
this.BringToFront();
}
}
至此功能已经完成。