Tôi đã xem nhiều bài đăng và câu hỏi về thuộc tính DesignMode của Biểu mẫu và UserControls. Ý tưởng là bạn muốn kiểm tra xem điều khiển có ở chế độ thiết kế hay không (ví dụ: điều khiển được hiển thị trong Visual Studio Designer) và tránh mã chỉ có thể chạy, tốt, thời gian chạy. Vấn đề tôi đã thấy nhiều người có - và bộ nhớ thất bại của tôi tiếp xúc với nó, gần đây - là thuộc tính DesignMode không hoạt động trong hàm tạo và không hoạt động cho các điều khiển lồng nhau. Tuy nhiên, nó hoạt động rất tốt trong trình xử lý sự kiện Load cho điều khiển hoặc biểu mẫu của bạn !!Sử dụng thuộc tính DesignMode so với LicenseManager.UsageMode
Khi bạn nghĩ về nó, mã trong các nhà xây dựng của Biểu mẫu hoặc UserControls chỉ nên xử lý trạng thái không yêu cầu biểu mẫu được tải. Việc xử lý mã với khởi tạo đối tượng UI có thể được đặt trong trình xử lý sự kiện Load cho điều khiển. Và trong hàm đó, thuộc tính DesignMode hoạt động. Nhà thiết kế sẽ sử dụng giá trị thích hợp của nó tại thời điểm đó.
Về nguyên tắc, phương thức InitializeComponent() đã được gọi nhưng trên thực tế, khi bạn hiển thị điều khiển trong dạng xem Thiết kế, Nhà thiết kế chỉ phân tích cú pháp chức năng đó, nó không chạy nó. Nhà thiết kế, tuy nhiên, không chạy hàm tạo của các điều khiển lồng nhau. Nếu bạn hoàn toàn cần phải đặt mã khởi tạo trong hàm tạo, hãy sử dụng lớpSystem.ComponentModel.LicenseManager, nó có một thuộc tính tĩnh được gọi là UsageMode có giá trị của DesignTime hoặc RunTime. Bạn hoàn toàn có thể tin tưởng rằng tài sản trong constructor của điều khiển của bạn - nhưng chỉ trong constructor!
Tôi đã quên mất chút tinh tế trong ứng dụng tôi đang làm việc vào lúc này. Để giải quyết vấn đề này, bây giờ tôi đang tôn trọng mẫu để tất cả các điều khiển và biểu mẫu cần khởi tạo thêm phải thực hiện một trình xử lý cho sự kiện Load. Ở đó, thuộc tính DesignMode hoạt động tốt, và tôi không bao giờ gặp khó khăn khi mở điều khiển người dùng và các biểu mẫu trong Trình thiết kế.
Nếu tôi có phân cấp lớp, đôi khi tôi làm cho trình xử lý sự kiện đó được bảo vệ ảo và tôi chỉ ghi đè nó khi lớp con cần khởi tạo thêm.
Tôi tự hỏi, tuy nhiên, nếu có những phương pháp tốt hơn trên mạng, hoặc nếu có cái gì đó có mùi về mô hình này (khác mà cần phải thực hiện một handler tải sự kiện nhiều lần?)
Rất hữu ích, cảm ơn. –