C#委託與事件的使用

功能要求:

有兩個窗口類,分別是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();
            }
        }

至此功能已經完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章