2009-07-08 27 views
6

Tôi đang tạo điều khiển Nhãn tùy chỉnh (chỉ cần Kế thừa điều khiển Nhãn tiêu chuẩn và vẽ lại nền và văn bản) vì tôi cần nền và đường viền rất cụ thể. Trong hàm tạo của điều khiển, tôi đặt thuộc tính AutoSize thành false nên tôi có thể có kích thước mặc định chuẩn cho nhãn mới.Kiểm soát nhãn hoạt động khác nhau tại thời điểm thiết kế so với thời gian chạy

Public Sub New() 

    'Set the default size of the control to 75x24 
    Me.Height = 24 
    Me.Width = 75 

    'Turn off the autosize property. 
    Me.AutoSize = False 

    'Turn on double-buffering. 
    Me.DoubleBuffered = True 

End Sub 

Trong ứng dụng của tôi sử dụng điều khiển này, nếu tôi tạo nhãn tùy chỉnh mới tại thời gian chạy (trong mã), thuộc tính AutoSize giữ nguyên và hoạt động bình thường.

Nếu tôi cố gắng thêm nhãn tùy chỉnh mới vào biểu mẫu của tôi tại thời điểm thiết kế, nó đi kèm với thuộc tính AutoSize được đặt thành True và tôi phải đặt thủ công thành False trong cửa sổ thuộc tính. Nó không phải là một vấn đề lớn, nhưng tôi không hiểu tại sao hành vi lại khác.

Bất kỳ ý tưởng nào gây ra sự khác biệt về hành vi này?

+0

Như một lưu ý phụ, trong hàm dựng của bạn, tôi sẽ đặt AutoSize thành false trước khi đặt Chiều cao và Chiều rộng. – NascarEd

+0

@NascarEd, Cảm ơn bạn đã lưu ý. Tôi đã thử cả hai cách và nó dường như không tạo nên sự khác biệt. – Stewbob

+0

Như một lưu ý khác: Sau khi tạo một điều khiển tùy chỉnh, bạn nên thả nó vào một biểu mẫu và kiểm tra mã mà nhà thiết kế tạo ra. Nhà thiết kế thường làm những việc bạn không mong đợi. – NascarEd

Trả lời

3

Cuối cùng tôi đã làm việc này trong VB. Tôi đã vô hiệu hóa câu lệnh Set, về cơ bản chuyển thuộc tính AutoSize bị ghi đè thành thuộc tính chỉ đọc.

 Public Overrides Property AutoSize() As Boolean 
     Get 
      Return MyBase.AutoSize 
     End Get 
     Set(ByVal value As Boolean) 
      'Do nothing here 
     End Set 
    End Property 

Nhờ NascarEd đã giúp tôi chỉ đúng hướng.

6

Trong lớp nhãn của bạn, bạn nên ghi đè thuộc tính AutoSize.

//(In C#) 
[System.ComponentModel.Browsable(false)] 
[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] 
public new bool AutoSize 
{ 
    get { return base.AutoSize; } 
    set { base.AutoSize = value; } 
} 

Thuộc tính có thể duyệt (giả) sẽ ẩn thuộc tính lúc thiết kế và thuộc tính DesignerSerializationVisibility sẽ yêu cầu nhà thiết kế không viết bất kỳ mã nào vào tệp thiết kế của bạn.

+0

Tôi đã thực hiện điều này, nhưng mặc dù nhà thiết kế không còn đặt rõ ràng thuộc tính AutoSize thành đúng, như nó đã làm trước đây, nó vẫn đặt rõ ràng thuộc tính .Size như thể AutoSize vẫn đang bật. Có lẽ tôi sẽ cố gắng ghi đè lên kích thước tài sản trong kiểm soát của tôi quá. – Stewbob

+0

Mặc dù điều này dường như không hoạt động trong VB, tôi đánh giá cao sự giúp đỡ của bạn. Nó đã cho tôi một cái nhìn sâu sắc hơn về việc tạo các điều khiển tùy chỉnh. Cảm ơn! – Stewbob

0

Nếu bạn chuyển sang chế độ thiết kế cho điều khiển mới mà bạn đang tạo, bạn sẽ có thể chọn điều khiển đó và thay đổi thuộc tính theo bất kỳ cách nào bạn muốn. Từ thời điểm đó, bất cứ khi nào bạn thêm điều khiển đó vào biểu mẫu (hoặc một điều khiển khác), nó sẽ có các thuộc tính mà bạn đặt ở đó làm mặc định. Điều này sẽ cho phép bạn thiết lập mặc định trong khi vẫn giữ chúng hiển thị để các nhà phát triển có thể thay đổi mọi thứ nếu họ không muốn nó được resizeable trong tương lai.

Hoặc, hãy kiểm tra mã do nhà thiết kế tạo ra, vì nó sẽ cho bạn thấy chính xác những gì nó đã làm để tạo ra hành vi mà bạn đang tìm kiếm.

2

Chỉ cần để biết tương lai của bạn, để thiết lập thuộc tính AutoSize False trong cửa sổ thuộc tính, bạn cần phải thiết lập một thuộc tính: -

< System.ComponentModel.DefaultValue (False) > _

Ghi đè công khai Thuộc tính AutoSize() Như Boolean ....

+0

Cảm ơn, thông tin tốt. – Stewbob

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