Frage an focus, button, winforms, keyboard – So erstellen Sie eine Winform mit Schaltflächen, die niemals den Tastaturfokus erregen

3

Ich habe ein paar Textfelder auf meiner Winform. Ich habe auch ein paar Knöpfe drauf. Wenn ich jetzt in ein solches Textfeld tippe und auf eine Schaltfläche klicke, geht der Eingabefokus aus dem Textfeld verloren und die Schaltfläche erhält den Eingabetastaturfokus. Das heißt, der Cursor verliert sich in dem Moment, in dem wir auf die Schaltfläche klicken, aus dem Textfeld. Ich will dieses Verhalten nicht. Ich möchte, dass mein Textfeld den Cursor auch dann enthält, wenn ich auf die Schaltfläche klicke. Die wirkliche Situation ist, dass ich Textbox- und Zifferntasten habe, die nur vom Touchscreen aus verwendet werden können.

Deine Antwort

4   die antwort
0

Erstellen Sie benutzerdefinierteButton Klasse mitFocusable Eigentum gesetztFocusable zufalse

<code>public class ButtonEx : Button
{
    [DefaultValue(true)]
    public bool Focusable
    {
        get { return GetStyle(ControlStyles.Selectable); }
        set { SetStyle(ControlStyles.Selectable, value); }
    }
}
</code>
9

ein eigenes Tastensteuerelement zu erstellen, das vom Standardsteuerelement erbt, das jedoch deaktiviert istSelectable Stil:

<code>public class ButtonEx : Button {
  public ButtonEx() {
    this.SetStyle(ControlStyles.Selectable, false);
  }
}
</code>
0

indem Sie auf die Ereignisbehandlungsroutine klicken:

<code>private void Button_Click(...)
{
    FocusTextBox();
    // Do things...
}

private void FocusTextBox()
{
    textBox.Focus();
}
</code>
Was wäre, wenn es mehr als zwei Textfelder gäbe? r.hamd
4

it aufeine andere Kontrolle. Wählen Sie ein Steuerelement, von dem Sie glauben, dass es sinnvoll ist, nach dem Drücken der Taste den Fokus zu erhalten. Setzen Sie beispielsweise den Fokus auf eine TextBox, indem Sie folgenden Code verwenden:

<code>textBox1.Focus();
</code>

Dadurch wird verhindert, dass Ihre Schaltfläche den Fokus erhält, wenn Sie auf eine Schaltfläche klicken.

Stellen Sie außerdem Ihre Schaltflächen einTabStop Eigenschaft auf falsch.

Die anderen Antworten schlagen vor, dass Sie das einstellenCanFocus property to false funktioniert nicht, da diese Eigenschaft für Schaltflächen schreibgeschützt ist.

@ r.hamd - du verstehst die Antwort falsch. In jedemTaste Klicken Sie auf Handler, setzen Sie den Fokus aufeine andere Kontrolle. Verwenden Sie alle Steuerelemente, die sinnvoll sind, um als Nächstes den Fokus zu haben. Eine logische Wahl ist, den Fokus auf zu setzenein Textfeld das istnach dem die Taste. Optisch würde dies genauso aussehen, wenn jemand in dieses Textfeld "getabbt" würde, um es zur aktiven Eingabe zu machen. Eine andere gute Alternative ist es, den Fokus auf das zu legenerstes Textfeld auf dem Formular. [Bearbeitungsantwort, um dies zu klären.] ToolmakerSteve
Das ist gut zu wissen. Gibt es eine Möglichkeit, das Flimmern zu verhindern und die Lösung mit mehr als einer TextBox zum Laufen zu bringen? Alexandre
Beachten Sie, dass die Eigenschaft [TabStop] der Einstellungsschaltfläche auf festgelegt istfalse, während es OPs Anfrage entspricht, einen Knopf zu haben, der "niemals den Tastaturfokus erregt", würde das Formular machenNicht verwendbar für Nur-Tastatur-Benutzer. Dies ist auf einem Touchscreen nicht erforderlich, und wenn eine Tastatur angeschlossen ist, sollte dies nicht erfolgen, da dies einen Verstoß darstelltZugänglichkeitsstandards. ich empfehlenicht dies zu tun. ToolmakerSteve
Was wäre, wenn es mehr als zwei Textfelder gäbe? r.hamd

Verwandte Fragen