WPF: Ein TextBox, die ein Ereignis hat, der ausgelöst wird, wenn die Enter-Taste gedrückt wird

StackOverflow https://stackoverflow.com/questions/816334

  •  03-07-2019
  •  | 
  •  

Frage

Statt ein PreviewKeyUp Ereignisses mit jedem TextBox in meiner App für die Befestigung und die Überprüfung, ob die gedrückte Taste ein Enter-Taste war und dann eine Aktion tun, entschied ich mich erweitert Version eines TextBox zu implementieren, die ein Default Ereignis umfasst, das ausgelöst wird, wenn ein Enter Key in einem TextBox gedrückt.

Was ich tat, war im Grunde eine neue Klasse erstellen, die mit einer öffentlichen Veranstaltung TextBox von DefaultAction erstreckt, wie so:

public class DefaultTextBoxControl:TextBox
{
    public event EventHandler<EventArgs> DefaultAction = delegate { };

    public DefaultTextBoxControl()
    {
        PreviewKeyUp += DefaultTextBoxControl_PreviewKeyUp;
    }

    void DefaultTextBoxControl_PreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key != Key.Enter)
        {
            return;
        }
        DefaultAction(this, EventArgs.Empty);
    }
}

Ich verwende diese benutzerdefinierte Textbox dann von meiner app wie solche (XAML):

<Controls:DefaultTextBoxControl  DefaultAction="DefaultTextBoxControl_DefaultAction">
</Controls:DefaultTextBoxControl>

Jetzt in meiner kleinen Erfahrung, die ich in das Lernen WPF hatte ich habe, dass fast die meiste Zeit realisiert gibt es ein „cooler“ (und hoffentlich einfacher) Art und Weise, Dinge zu implementieren

... so meine Frage ist, Wie kann ich die obige Steuerung verbessern? Oder vielleicht gibt es eine andere Art und Weise ich die obige Steuerung tun kann? ... vielleicht nur deklarativen Code statt sowohl deklarativen (XAML) und verfahren (C #)?

mit
War es hilfreich?

Lösung

Hier finden Sie aktuelle diesem Blog-Eintrag von einem wenige Monate, wo ich eine ‚globale‘ Event-Handler anhängen zurück TextBox.GotFocus den Text auszuwählen.

Im Wesentlichen können Sie die KeyUp Ereignis in Ihrem App-Klasse behandeln, wie folgt aus:

protected override void OnStartup(StartupEventArgs e)
{
    EventManager.RegisterClassHandler(typeof(TextBox),
        TextBox.KeyUpEvent,
        new System.Windows.Input.KeyEventHandler(TextBox_KeyUp));

    base.OnStartup(e);
}

private void TextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key != System.Windows.Input.Key.Enter) return;

    // your event handler here
    e.Handled = true;
    MessageBox.Show("Enter pressed");
}

... und jetzt alle TextBox in Ihre Anwendung wird die TextBox_KeyUp Methode aufrufen, wie Benutzer in der Eingabe.

Aktualisieren

Wie Sie in Ihrem Kommentar darauf hingewiesen haben, ist dies nur dann sinnvoll, wenn jeder TextBox den gleichen Code ausführen muss.

Um ein beliebiges Ereignis hinzufügen, wie ein Geben Sie keypress, könnten Sie besser dran sein Blick in angebaute Veranstaltungen . Ich glaube, das können Sie bekommen, was Sie wollen.

Andere Tipps

Da diese Frage gestellt wurde, gibt es jetzt eine InputBindings Eigenschaft auf Textfelder und andere Steuerelemente. Damit kann eine rein XAML-Lösung verwendet werden, anstatt benutzerdefinierte Steuerelemente verwenden. Zuweisen von KeyBindings für Return und Enter Punkt auf einen Befehl kann dies tun.

Beispiel:

<TextBox Text="Test">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding SomeCommand}" Key="Return" />
        <KeyBinding Command="{Binding SomeCommand}" Key="Enter" />
    </TextBox.InputBindings>
</TextBox>

Einige haben erwähnt, dass Enter nicht immer funktioniert, und Return kann auf einigen Systemen verwendet werden.

Wenn der Benutzer den Schlüssel in dem Textfeld eingeben drückt, erscheint die Eingabe in dem Textfeld in einem anderen Bereich der Benutzeroberfläche (UI).

Das folgende XAML erstellt die Benutzeroberfläche, die aus einem Stackpanel besteht, ein Textblock, und einen Text.

<StackPanel>
  <TextBlock Width="300" Height="20">
    Type some text into the TextBox and press the Enter key.
  </TextBlock>
  <TextBox Width="300" Height="30" Name="textBox1"
           KeyDown="OnKeyDownHandler"/>
  <TextBlock Width="300" Height="100" Name="textBlock1"/>
</StackPanel>

Der folgende Code hinter erstellt die KeyDown-Ereignishandler. Wenn der Schlüssel, der gedrückt wird, ist der Schlüssel der Eingabetaste, wird eine Meldung im Textblock angezeigt.

private void OnKeyDownHandler(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Return)
    {
        textBlock1.Text = "You Entered: " + textBox1.Text;
    }
}

Für weitere Informationen lesen Sie MSDN Doc

    private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
    {
        string etr = e.Key.ToString();

        if (etr == "Return")
        {
            MessageBox.Show("You Press Enter");
        }
    }

hinzufügen Ereignis in xaml auf die spezifische Textbox oder Objekt:

KeyDown="txtBarcode_KeyDown"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top