Nói chung, đúng cách để có ứng dụng của bạn làm điều gì đó khác hơn so với mặc định (mở một hình thức, chờ đợi cho nó để đóng, sau đó thoát) là tạo một lớp kế thừa từ ApplicationContext
. Sau đó, bạn chuyển một thể hiện của lớp của bạn đến phương thức Application.Run
. Khi ứng dụng đóng, hãy gọi ExitThread()
từ trong lớp học của bạn.
Trong trường hợp này, bạn có thể tạo các phiên bản của ba biểu mẫu khi ứng dụng tải và đăng ký trình xử lý cho các sự kiện Closed
của họ. Khi mỗi biểu mẫu được đóng lại, trình xử lý sẽ kiểm tra xem có bất kỳ biểu mẫu nào khác vẫn mở và nếu không sẽ đóng ứng dụng.
The example on MSDN đang làm hai điều:
- mở nhiều hình thức và thoát khỏi ứng dụng khi tất cả chúng đều đóng
- tiết kiệm kích thước cuối cùng và vị trí của các hình thức khi mỗi hình thức được đóng lại.
Một ví dụ đơn giản, trong đó đóng ứng dụng chỉ sau khi tất cả các hình thức đóng cửa:
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();
}
}
Sau đó, lớp Program
của bạn trông như thế này:
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyApplicationContext());
}
}
Ứng dụng này đóng cửa Logic có thể rõ ràng là được tùy chỉnh - là bất kỳ biểu mẫu nào vẫn mở hoặc chỉ một trong ba loại này hoặc chỉ ba phiên bản đầu tiên (yêu cầu giữ tham chiếu đến ba phiên bản đầu tiên, có thể là trong List<Form>
).
sự kiện toàn cầu cho mỗi lần tạo biểu mẫu - this có vẻ đầy hứa hẹn.
Ví dụ tương tự here.
Nguồn
2012-11-15 21:26:00
Điều duy nhất với điều này là, làm sao anh biết khi nào chương trình đóng? Theo người dùng, anh ta có thể đóng cửa sổ bất kỳ lúc nào. –
@DJBurb Ông ấy chỉ định hành vi đóng mong muốn ở đâu? Nếu ứng dụng kết thúc khi * tất cả * 3 được đóng lại, khi * bất kỳ * 3 nào bị đóng, hoặc khi một biểu mẫu cụ thể bị đóng? Một, hoặc bất kỳ, đều dễ dàng. Tất cả sẽ là một công việc nhiều hơn nữa. – Servy
Tôi nghĩ rằng bạn cần phải tìm ra chính mình, nhưng bạn có thể sử dụng ['Form.FormClosing'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing. aspx) sự kiện để tìm thấy khi một hình thức là beeing đóng cửa, hủy bỏ đóng cửa và ẩn các hình thức thay thế. Khi tất cả các biểu mẫu bị ẩn, hãy đóng ứng dụng. –