功能要求:
有兩個窗口類,分別是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();
}
}
至此功能已經完成。