2009-04-24 18 views
11

Có cách nào để làm cho UserControl không thể thực hiện được không?Có cách nào để làm cho UserControl không thể thực hiện được không?

EDIT: Vì vậy SetStyle(ControlStyles.Selectable, false)

là con đường để đi. Nhưng vẫn có sự khác biệt với Control. Nếu bạn kế thừa biểu mẫu Control, điều khiển ban đầu sẽ không bị mất tiêu điểm. Nhưng sau khi nhấp vào kiểm soát của bạn có nguồn gốc từ UserControl

ControlStyles.Selectable 

được áp dụng tiêu điểm bị xóa khỏi kiểm soát ban đầu.

Trả lời

12

Trong constructor của bạn sau khi InitializeComponent() bạn cần phải gọi SetStyle và thiết lập ControlStyles.Selectable phong cách để false:

SetStyle(ControlStyles.Selectable, false); 
+1

Nó không hoạt động trong trường hợp khi UserControl đã nhúng TextBox. Hộp văn bản sẽ lấy nét. – volody

+1

@volody: Có, điều khiển con có thể lấy nét, nhưng 'UserControl' không thể. –

0

Đã bật = sai, có lẽ?

+0

Tiêu điểm bị tắt ...Nhưng có những tác dụng phụ như hành vi khác nhau của hình ảnh nền ... Vì vậy, tốt đẹp thử .. :) – Matze

1

Một UserControl hoặc bất kỳ Điều khiển nào, sẽ không thể nhận tiêu điểm nếu thuộc tính CanFocus trả về sai. Nếu bạn nhìn vào mã trong phản xạ về cơ bản nó sẽ kiểm tra 3 thuộc tính và nếu có sai thì nó sẽ không tập trung được.

  • IsHandleCreated
  • IsVisible
  • IsEnabled

Thiết lần đầu tiên hai là false và có một điều khiển hoạt động là khá nhiều mâu thuẫn. Nếu nó có thể mặc dù để kiểm soát của bạn để được chức năng với IsEnabled là sai thì điều đó sẽ làm việc.

+3

Dễ dàng hơn nhiều để chỉ cần đặt kiểu ControlStyles.Selectable thành false. –

2

Vâng, setStyle (ControlStyles.Selectable, false); chỉ hoạt động nếu bạn đang kế thừa từ một điều khiển.

Nó sẽ không hoạt động nếu bạn kế thừa từ điều khiển người dùng.

Để khắc phục sự cố, tôi đã thêm bảng điều khiển vào điều khiển người dùng và gắn bảng điều khiển vào "Điền". Thêm phần còn lại của các điều khiển vào bảng điều khiển thay vì điều khiển người dùng. Nó đã làm việc!

0

Bạn có thể đến gần hơn với những gì bạn muốn bằng cách đặt TabStop thành sai. Điều đó sẽ ngăn điều khiển không tập trung khi, ví dụ, một hộp thoại phía trên biểu mẫu sở hữu của nó sẽ đóng lại.

4

Bên cạnh ControlStyles.Selectable đó cũng là một ControlStyles.ContainerControl - tài liệu là khá thưa thớt về chủ đề này (Nếu đúng, việc kiểm soát là một điều khiển container như), nhưng nó bằng cách nào đó ảnh hưởng nếu các điều khiển con được tập trung thay vì sự kiểm soát chinh no.

EDIT:

Tôi vừa nhận thấy một thực tế thú vị. Xem một UserControl trong phản xạ cho thấy rằng nó buộc thiết lập trọng tâm đầu vào trong OnMouseDown. Vì vậy, ghi đè OnMouseDown mà không cần gọi base.OnMouseDown (e) giải quyết vấn đề mà không có tác dụng phụ.

[EditorBrowsable(EditorBrowsableState.Advanced)] 
protected override void OnMouseDown(MouseEventArgs e) 
{ 
    if (!this.FocusInside()) 
    { 
     this.FocusInternal(); 
    } 
    base.OnMouseDown(e); 
} 
Các vấn đề liên quan