2009-04-24 7 views
11

Gibt es eine Möglichkeit, ein UserControl unkenntlich zu machen?Gibt es eine Möglichkeit, ein UserControl unkenntlich zu machen?

EDIT: So SetStyle(ControlStyles.Selectable, false)

ist der Weg zu gehen. Aber immer noch gibt es einen Unterschied zu Control. Wenn Sie das Formular Control erben, verliert die anfängliche Steuerung nicht den Fokus. Aber nach Ihrer Kontrolle Klick auf die von UserControl und

ControlStyles.Selectable 

angewendet Fokus abgeleitet wird, wird von der ersten Steuerung entfernt.

Antwort

12

In Ihrem Konstruktor nach InitializeComponent() müssen Sie SetStyle und stellen Sie den ControlStyles.Selectable Stil false nennen:

SetStyle(ControlStyles.Selectable, false); 
+1

Es funktioniert nicht, wenn UserControl TextBox eingebettet hat. Das Textfeld erfasst den Fokus. – volody

+1

@volody: Ja, das untergeordnete Steuerelement kann den Fokus erfassen, aber das 'UserControl' kann nicht. –

0

Aktiviert = falsch, vielleicht?

+0

Fokus ist deaktiviert ...Aber es gibt Nebenwirkungen wie unterschiedliches Verhalten von Hintergrundbildern ... So nice try .. :) – Matze

1

Ein UserControl oder ein Steuerelement kann den Fokus nicht erhalten, wenn die CanFocus-Eigenschaft false zurückgibt. Wenn Sie sich den Code in reflector ansehen, prüft er grundsätzlich 3 Eigenschaften und wenn welche falsch sind, dann ist es nicht fokussierbar.

  • IsHandleCreated
  • IsVisible
  • IsEnabled

die ersten beiden zu falschen Einstellung und eine funktionierende Kontrolle mit so ziemlich ein Widerspruch ist. Wenn es möglich ist, dass Ihre Kontrolle funktioniert, obwohl IsEnabled falsch ist, sollte das funktionieren.

+3

Viel einfacher, nur die ControlStyles.Selectable Stil auf false setzen. –

2

Ja, die SetStyle (ControlStyles.Selectable, false); funktioniert nur, wenn Sie von einem Steuerelement erben.

Es wird nicht funktionieren, wenn Sie von einem Benutzersteuerelement erben.

Um das Problem zu umgehen, fügte ich dem Benutzersteuerelement ein Panel hinzu und dockte das Panel an "Fill". Der Steuerung wurden statt des Benutzersteuerelements weitere Steuerelemente hinzugefügt. Es funktionierte!

0

Sie können näher an die gewünschten Einstellungen kommen, indem Sie TabStop auf false setzen. Dadurch wird verhindert, dass das Steuerelement fokussiert wird, wenn beispielsweise eine Dialogbox über dem zugehörigen Formular geschlossen wird.

4

Neben ControlStyles.Selectable gibt es auch ein ControlStyles.ContainerControl - die Dokumentation eher spärlich ist zu diesem Thema (Wenn das stimmt, ist die Steuerung eine containerartigen Kontrolle), aber es wirkt irgendwie, wenn die untergeordneten Steuerelemente anstelle der Steuer konzentrieren erhalten selbst.

EDIT:

ich eine andere interessante Tatsache gerade bemerkt haben. Wenn Sie ein Benutzersteuerelement in reflector anzeigen, wird das Festlegen des Eingabefokus in OnMouseDown erzwungen. Das Überschreiben von OnMouseDown ohne Aufruf von base.OnMouseDown (e) behebt das Problem ohne Nebenwirkungen.

[EditorBrowsable(EditorBrowsableState.Advanced)] 
protected override void OnMouseDown(MouseEventArgs e) 
{ 
    if (!this.FocusInside()) 
    { 
     this.FocusInternal(); 
    } 
    base.OnMouseDown(e); 
} 
Verwandte Themen