[英]Enable a button after closing a form
我想在第二個窗體關閉時從主窗體啟用一個按鈕。 我讀過一些有關調用的內容,但了解得不多。
我怎樣才能做到這一點?
當您關閉第二個窗體時,將自動引發其FormClosed
事件。 在引發事件之前,您可以向事件注冊事件處理程序。 這使您能夠編寫事件發生時自動執行的代碼。
通過在事件中添加委托實例,可以在.NET中注冊事件處理程序。 委托是一種描述方法簽名的類型。 如果使用gcnew實例化委托,則將其與代碼中的函數關聯。 您可以自己調用委托(這里不需要),也可以將其傳遞給其他代碼,然后再調用它。 后者用於事件。
對於您而言,這意味着:
FormClosed
事件的委托類型。 是FormClosedEventHandler,它定義為delegate void FormClosedEventHandler(Object^ sender, FormClosedEventArgs^ e)
FormClosed
事件,然后在事件處理程序中啟用按鈕。 一個例子:
ref class MainForm
{
...
// event handler function (compatible to the FormClosedEventHandler delegate)
void OnSecondFormClosed(Object^ sender, FormClosedEventArgs^ e)
{
myButton->Enabled = true;
}
void DoSomethingWithSecondForm(Form^ secondForm)
{
// get a disabled Button
myButton->Enabled = false;
// create an event handler by instantiating a delegate
FormClosedEventHandler^ handler = gcnew FormClosedEventHandler(this, &MainForm::OnSecondFormClosed);
// register event handler
secondForm->FormClosed += handler;
}
...
}
(我沒有編譯代碼,但這通常是這樣工作的)
當兩個涉及的表單都是從同一線程中創建的時,則無需執行其他一些Invoke
。 否則,必須將對控件的更改放入創建控件的同一線程中。 您可以通過將委托傳遞給Control::Invoke
或Control::BeginInvoke
。
// event handler function (compatible to the FormClosedEventHandler delegate)
void OnSecondFormClosed(Object^ sender, FormClosedEventArgs^ e)
{
if (myButton->InvokeRequired)
{
// create a delegate to call the same event handler again
FormClosedEventHandler^ handler = gcnew FormClosedEventHandler(this, &MainForm::OnSecondFormClosed);
// BeginInvoke causes the delegate to be called asynchronously from the UI thread
myButton->BeginInvoke(handler, sender, e);
// nothing to be done here, the actual work happens when the delegate is actually called
return;
}
myButton->Enabled = true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.