Generalnie sposób prawo mieć swoją aplikację zrobienia czegoś innego niż domyślny (otworzyć formularz, czekać na to, aby zamknąć, następnie zakończ) jest utworzenie klasy, która dziedziczy po ApplicationContext
. Następnie przekazujesz instancję klasy do metody Application.Run
. Gdy aplikacja powinna się zamknąć, zadzwoń pod numer ExitThread()
z poziomu swojej klasy.
W takim przypadku można utworzyć wystąpienia trzech formularzy po załadowaniu aplikacji i zarejestrować procedurę obsługi dla ich zdarzeń Closed
. Kiedy każdy formularz zostanie zamknięty, przewodnik sprawdzi, czy są jeszcze jakieś inne formularze, a jeśli nie, zamknie aplikację.
The example on MSDN robi dwie rzeczy:
- otwierania wielu form i wychodzenia z aplikacji, gdy są one zamknięte
- zapisując ostatni rozmiar i położenie każdej postaci, gdy forma jest zamknięta.
prostszy przykład, który zamyka aplikację tylko po wszystkie formy są zamknięte:
class MyApplicationContext : ApplicationContext {
private void onFormClosed(object sender, EventArgs e) {
if (Application.OpenForms.Count == 0) {
ExitThread();
}
}
public MyApplicationContext() {
//If WinForms exposed a global event that fires whenever a new Form is created,
//we could use that event to register for the form's `FormClosed` event.
//Without such a global event, we have to register each Form when it is created
//This means that any forms created outside of the ApplicationContext will not prevent the
//application close.
var forms = new List<Form>() {
new Form1(),
new Form2(),
new Form3()
};
foreach (var form in forms) {
form.FormClosed += onFormClosed;
}
//to show all the forms on start
//can be included in the previous foreach
foreach (var form in forms) {
form.Show();
}
//to show only the first form on start
//forms[0].Show();
}
}
Następnie klasa Program
wygląda następująco: logika zamykanie
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyApplicationContext());
}
}
aplikacja może oczywiście być spersonalizowane - czy formularze są nadal otwarte, czy tylko jeden z tych trzech typów, lub tylko pierwsze trzy instancje (które wymagałyby odniesienia do pierwszych trzech instancji, ewentualnie w List<Form>
).
Re: globalne wydarzenie dla każdego tworzenia formularza - this wygląda obiecująco.
Podobny przykład: here.
Jedyna rzecz z tym, to skąd on wie, kiedy program ma się zamknąć? Według użytkownika, może on zamknąć każde okno w dowolnym momencie. –
@DJBurb Gdzie on określa pożądane zachowanie zamknięcia? Czy aplikacja kończy się, gdy * wszystkie * 3 zostaną zamknięte, gdy * any * 3 zostaną zamknięte, lub gdy określony formularz zostanie zamknięty? Jeden lub dowolny, oba są łatwe. Wszystko byłoby odrobinę więcej pracy. – Servy
Wydaje mi się, że musisz to sobie wyobrazić, ale możesz skorzystać z ['Form.FormClosing'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing. aspx), aby dowiedzieć się, kiedy formularz jest zamknięty, przerwij zamykanie i ukryj formularz. Kiedy wszystkie formularze są ukryte, zamknij aplikację. –