2009-07-29 62 views
1

我有一個包含一個文本框的動態加載到窗體的用戶控件。 在表單啓動時,我啓動了usercontrol,並將其可見性標記設置爲'false'。 我想在用戶控件變得可見時自動觸發一個方法,因爲此方法將一些輸出寫入文本框,此方法應該只在usercontrol及其所有繼承的控件對用戶可見後纔開始執行。

我認爲paintEventHandler應該是當一個窗體及其繼承的控件在例如控件的可見性發生變化後重新繪製時觸發的最後一個事件。


因此,訂閱paintEventHandler應在表單完全重新繪製後觸發我訂閱的方法,但顯然不是,我的方法在我的文本框仍處於隱藏狀態時執行,僅在方法執行完畢後纔可見。

對此有何想法?如何在用戶控件完全可見後執行方法

private void processControl_SetActive(object sender, CancelEventArgs e) 
     { 

      this.BeginInvoke((MethodInvoker)delegate 
      { 
       this.Paint += new PaintEventHandler(processControl_Paint); 
      }); 

     } 

void processControl_Paint(object sender, PaintEventArgs e) 
     { 
      //Should only be called when everything is fully loaded and visible on the form. 
      //Application.DoEvents() ->probably bad idea?? 
      AddStuffToTextBox(); 
     } 
+1

你想從更高的水平完成什麼?例如,爲什麼在文本框不可見時向文本框添加文本是不可接受的?讓我們幫助您嘗試解決實際問題,這可能涉及與您在問題中概述的方法不同的方法。 – Eric 2009-07-29 12:01:18

+0

sich沒有真正的問題。但是,如果在文本框行之後添加文本,並且在用戶實際看到文本框從一開始就被填滿之間存在一定的延遲,那將會很不錯。現在,在窗體仍在加載時寫入文本框的行只是在完成後立即出現。顯然,在'visibleChanged'事件上註冊並不能做到這一點。我更期待的是說,一個事件「我做現在載入和處理所有UI事件,你現在可以走了,並添加表格/使用任何控制」。 – Mez 2009-07-29 18:42:03

回答

0

您可以訂閱您的控件的VisibleChanged事件或重寫OnVisibleChanged。要僅在顯示用戶控件時調用您的代碼,請將post方法調用到控制消息隊列中。如果VisibleChanged在您的情況下失敗,您也可以使用Paint事件嘗試它,但我不這麼認爲。順便說一句,爲什麼你通過BeginInvoke添加事件?

void OnVisibleChanged(EventArgs e) 
{ 
    //Should only be called when everything is fully loaded and visible on the form. 
    //Application.DoEvents() -> actually bad idea!! 
    if (IsHandleCreated) 
     BeginInvoke(new MethodInvoker(AddStuffToTextBox)); 
    base.OnVisibleChanged(e); 
} 
2

你可以嘗試添加文本框初始化代碼的處理程序用戶控件的輸入事件,該事件觸發時,控制增益輸入焦點,然後在你的代碼,激活控制確保您撥打將控件上的焦點方法設置爲活動狀態。你可能會想要保留一個標誌,所以這隻在第一次出現控制增益輸入焦點時完成。

0

既然你真正想要做的是填補行的文本框中行,我會當VisibleChanged事件被觸發建議啓動一個定時器。在計時器的滴答事件中,您可以添加一行文字。如果在第一個計時器打勾前需要等待更長時間,則將計時器的延遲設置得更長,然後在第一次通過Tick事件處理程序時將其延遲。

相關問題