2010-05-07 4 views
20

Tôi sẽ cố gắng giải thích những gì tôi theo sau. Tôi không biết thuật ngữ kỹ thuật cho nó, do đó, ở đây đi:Làm cách nào để bật hỗ trợ thiết kế trong điều khiển tùy chỉnh?

Ví dụ 1: Nếu tôi đặt một ListView trên biểu mẫu và thêm một số cột tôi có thể, trong thiết kế thời gian, để bấm và kéo các cột để thay đổi kích thước chúng.

Ví dụ 2: Bây giờ, tôi đặt một ListView trong một UserControl và đặt tên là "MyCustomListView" (và có lẽ thêm một số phương pháp để nâng cao nó bằng cách nào đó).

Nếu tôi biết đặt "MyCustomListView" trên biểu mẫu Tôi không thể nhấp và kéo các tiêu đề cột để đổi kích thước chúng trong Thiết kế-thời gian.

Có cách nào để dễ dàng thực hiện điều đó không? Một số hình thức "chuyển sự kiện nhấp và kéo vào điều khiển cơ bản và để điều khiển đó thực hiện phép thuật". Im không thực sự tìm cách để recode, chỉ cần vượt qua trên mouseclick (hoặc bất cứ điều gì nó được) và để cho, trong trường hợp này, ListView phản ứng như nó đã làm trong ví dụ đầu tiên ở trên.

Trả lời

47

Trình thiết kế Windows Forms có các lớp thiết kế dành riêng cho hầu hết các điều khiển. Nhà thiết kế cho một ListView là System.Windows.Forms.Design.ListViewDesigner, một lớp nội bộ trong hội đồng System.Design.dll. Lớp này cung cấp cho bạn khả năng kéo các tiêu đề cột.

Một UserControl sử dụng lớp thiết kế System.Windows.Forms.Design.ControlDesigner. Nó không làm bất cứ điều gì đặc biệt, chỉ cần đặt một hình chữ nhật xung quanh điều khiển bằng các chốt kéo. Bạn có thể thấy nơi này là nhóm: sau khi bạn đặt điều khiển người dùng của bạn trên một biểu mẫu, đó là ControlDesigner được sử dụng để thiết kế lớp, ListViewDesigner không có trong hình. Do đó, bạn sẽ mất khả năng kéo các tiêu đề cột. Cũng lưu ý rằng ControlDesigner không cấp quyền truy cập vào các điều khiển bên trong UC.

Điều đó có thể khắc phục được bằng cách tạo nhà thiết kế của riêng bạn. Bắt đầu với dự án + Thêm tài liệu tham khảo, chọn System.Design. Bạn sẽ cần thêm thuộc tính công khai vào UC để hiển thị chế độ xem danh sách và áp dụng thuộc tính [DesignerSerializationVisibility] để cho phép lưu các thuộc tính đã thay đổi. Và áp dụng thuộc tính [Designer] cho lớp UC để thay thế trình thiết kế mặc định. Tất cả sẽ giống như thế này (sử dụng tên mặc định và ListView hiển thị "nhân viên"):

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; // Note: add reference required: System.Design.dll 

namespace WindowsFormsApplication1 { 
    [Designer(typeof(MyDesigner))] // Note: custom designer 
    public partial class UserControl1 : UserControl { 
     public UserControl1() { 
      InitializeComponent(); 
     } 

     // Note: property added 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
     public ListView Employees { get { return listView1; } } 
    } 

    // Note: custom designer class added 
    class MyDesigner : ControlDesigner { 
     public override void Initialize(IComponent comp) { 
      base.Initialize(comp); 
      var uc = (UserControl1)comp; 
      EnableDesignMode(uc.Employees, "Employees"); 
     } 
    } 
} 

Chế độ xem danh sách trong điều khiển người dùng hiện có thể được nhấp và thiết kế như bình thường.

+6

++ cảm ơn bạn đã tử tế. Rất vui khi bạn xuất hiện và dạy tôi điều gì đó. –

+4

Đó chỉ là ví dụ hoàn hảo về câu trả lời hoàn hảo =) Thx! – Ted