2009-04-24 12 views
11

Czy istnieje sposób na uniezależnienie UserControl?Czy istnieje sposób na uniezależnienie UserControl?

EDIT: Więc SetStyle(ControlStyles.Selectable, false)

jest droga. Ale nadal istnieje różnica do Control. Jeśli dziedziczysz formularz Control, kontrola początkowa nie traci ostrości. Ale po kliknięciu na swoją kontrolę, która wywodzi się z UserControl i

ControlStyles.Selectable 

nakłada nacisk zostanie usunięty z początkowej kontroli.

Odpowiedz

12

W konstruktora po InitializeComponent() trzeba zadzwonić SetStyle i ustawić ControlStyles.Selectable styl false:

SetStyle(ControlStyles.Selectable, false); 
+1

Nie działa w przypadku, gdy UserControl ma wbudowany TextBox. Pole tekstowe będzie przechwytywać ostrość. – volody

+1

@volody: Tak, kontrola podrzędna może przechwycić ostrość, ale "UserControl" nie może. –

0

Włączone = fałsz, być może?

+0

Ostrość jest wyłączona ...Ale są efekty uboczne, takie jak różne zachowanie obrazów tła ... Tak miło próbuję .. :) – Matze

1

Kontrola Użytkownika lub dowolna Kontrola nie będzie mogła uzyskać fokusa, jeśli właściwość CanFocus zwróci wartość false. Jeśli spojrzysz na kod w odbłyśniku, w zasadzie sprawdza on 3 właściwości, a jeśli jakiekolwiek są fałszywe, to nie będzie można ustawić ostrości.

  • IsHandleCreated
  • IsVisible
  • IsEnabled

Ustawianie pierwsze dwa false i posiadające funkcjonującej kontroli jest dość dużo sprzeczności. Jeśli jest to możliwe, aby Twoja kontrola była funkcjonalna, a IsEnabled jest fałszywa, to powinno działać.

+3

O wiele łatwiej jest ustawić styl ControlStyles.Selectable na false. –

2

Tak, setStyle (ControlStyles.Selectable, false); działa tylko wtedy, gdy dziedziczysz po kontroli.

To nie zadziała, jeśli dziedziczysz po kontroli użytkownika.

Aby obejść problem, dodałem panel do kontroli użytkownika i zadokowałem panel do "Wypełnienia". Dodano pozostałe elementy sterujące do panelu zamiast sterowania użytkownika. Zadziałało!

0

Możesz zbliżyć się do tego, co chcesz, ustawiając wartość TabStop na wartość false. Zapobiegnie to skupieniu się kontrolki, gdy na przykład zamknie się okno dialogowe nad jego formularzem.

4

Poza ControlStyles.Selectable istnieje również ControlStyles.ContainerControl - dokumentacja jest raczej rzadki w tym temacie (Jeśli to prawda, kontrola jest pojemnik jak kontrola), ale to jakoś wpływa Jeśli kontrole dziecko dostać zamiast koncentrować się na kontroli samo.

EDIT:

Właśnie zauważyłem inny ciekawy fakt. Wyświetlanie kontrolki UserControl w odbłyśniku pokazuje, że wymusza ustawienie fokusu wejściowego w OnMouseDown. Więc przesłonięcie OnMouseDown bez wywoływania bazy.OnMouseDown (e) rozwiązuje problem bez żadnych skutków ubocznych.

[EditorBrowsable(EditorBrowsableState.Advanced)] 
protected override void OnMouseDown(MouseEventArgs e) 
{ 
    if (!this.FocusInside()) 
    { 
     this.FocusInternal(); 
    } 
    base.OnMouseDown(e); 
} 
Powiązane problemy