2009-09-17 30 views
5

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?)

+0

Rất hữu ích, cảm ơn. –

Trả lời

2

Bởi vì trong những vấn đề với bằng cách sử dụng thuộc tính DesignMode với các điều khiển lồng nhau (và các vấn đề liên quan), cách tiếp cận chung của tôi cho vấn đề này là thậm chí không cố gắng để UserControls tùy chỉnh của tôi hoạt động trong chế độ thiết kế. Thông thường các điều khiển của tôi rất phức tạp và được vẽ bởi chủ sở hữu, vì vậy ngay cả khi DesignMode làm việc với các điều khiển lồng nhau, nó sẽ mất rất nhiều nỗ lực lập trình để khiến chúng hiển thị bất kỳ điều gì có ý nghĩa trong chế độ thiết kế (và nó sẽ làm chậm công việc phát triển. các điều khiển yêu cầu một lượng đáng kể thời gian khởi tạo và thiết lập).

Thông thường tôi chỉ thêm phương thức Setup() hoặc LoadData() công khai thực hiện tất cả công việc và chỉ gọi phương thức này khi chạy. Trong chế độ thiết kế, sau đó, UserControl chỉ hiển thị như một hình vuông, giúp tôi vị trí của nó và không có gì hơn.

Tôi muốn biết liệu bạn có nhận được bất kỳ câu trả lời nào khác cho câu hỏi này hay không, điều đó có thể giải quyết được sự cố của bạn.

+0

Đó là một sự tiện lợi thực sự để có thể xem xét điều khiển của bạn trong chế độ xem thiết kế, đặc biệt nếu bạn muốn phân lớp chúng. Nếu bạn không, thì ít nhất một khung cho bố trí của điều khiển trong một biểu mẫu chỉ là tốt (như bạn đang làm). Nếu điều khiển sử dụng rất nhiều tiêu chuẩn và bạn cần phải tinker với các vị trí, thuộc tính hoặc với trình xử lý sự kiện của các thành phần của điều khiển, thì khung nhìn Thiết kế trông thực tế trở nên quan trọng. Bên cạnh đó, tôi nghĩ rằng thật đáng để biết rằng kiểm soát của tôi có thể được sử dụng bởi một người có thể không có mã cho nó :). –

+0

@Sam: Tôi hoàn toàn đồng ý với mọi thứ bạn nói và đôi khi tôi bị lôi cuốn vào việc cố gắng điều khiển công việc của mình trong chế độ thiết kế. Ngay sau khi tôi gặp phải những vấn đề nghiêm trọng, tôi thường bỏ thuốc lá, mặc dù đôi khi không đủ sớm. – MusiGenesis

Các vấn đề liên quan