Có lỗi trong Windows Forms làm cho biểu mẫu biến mất khỏi bộ sưu tập Application.OpenForms. Điều này sẽ xảy ra khi bạn chỉ định các hộp thoại ShowInTaskbar, FormBorderStyle, Hộp điều khiển, Min/MaximizedBox, RightToLeftLayout, HelpButton, Opacity, TransparencyKey, ShowIcon hoặc MdiParent sau khi cửa sổ được tạo. Các thuộc tính này đặc biệt ở chỗ chúng được chỉ định làm cờ kiểu trong lệnh gọi CreateWindowEx() gốc. Biểu mẫu mẫu này minh họa lỗi:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
button1.Click += button1_Click;
}
private void button1_Click(object sender, EventArgs e) {
Console.WriteLine(Application.OpenForms.Count);
this.ShowInTaskbar = !this.ShowInTaskbar;
Console.WriteLine(Application.OpenForms.Count);
}
}
Biểu mẫu Windows phải gọi lại cho CreateWindowEx() để thay đổi thuộc tính hiệu quả, chuyển các cờ kiểu khác nhau. Phá hủy cửa sổ ban đầu đầu tiên có các hiệu ứng phụ vượt ra ngoài nhấp nháy rất đáng chú ý, một trong số đó là lớp Ứng dụng mất dấu vết của biểu mẫu vì nó thấy cửa sổ biến mất. Với lỗi mà nó không thêm nó trở lại khi cửa sổ mới được tạo ra. Tránh lỗi bằng cách thiết lập thuộc tính chỉ trong hàm tạo, mã chạy trước khi CreateWindowEx() được gọi, không phải trong bất kỳ trình xử lý sự kiện nào.
Nói chung, tránh dựa vào OpenForms do lỗi này. Cung cấp cho lớp cần hiển thị hộp thông báo một tham chiếu đến cá thể biểu mẫu thông qua hàm tạo của nó. MessageBox thường tự tìm ra một cửa sổ chính, btw, nó sẽ chọn cửa sổ đang hoạt động và đúng 99% thời gian. Nếu bạn cần nó để gọi BeginInvoke() từ một chuỗi công nhân thì hãy chắc chắn sao chép SynchronizationContext.Current trong constructor của bạn và gọi phương thức Post() của nó sau này. Đảm bảo thư viện của bạn cũng sẽ hoạt động với các thư viện lớp GUI khác.
Nguồn
2010-09-20 13:07:56
Vui lòng cung cấp thêm thông tin. – SLaks
Nếu tôi kiểm tra Application.OpenForms.Count ở dạng tải nó cho thấy tôi 1. Một cái gì đó là lạ với bạn ứng dụng, bạn cần phải cung cấp thêm chi tiết về làm thế nào để tái sản xuất vấn đề. –
Ứng dụng của tôi có dạng chính. Mặc dù tôi có biểu mẫu được mở tại thời điểm mã này được thực thi, nó trả về 0. Cảm ơn Albin, SLaks – Ananth