WPF: Ein TextBox, die ein Ereignis hat, der ausgelöst wird, wenn die Enter-Taste gedrückt wird
-
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 #)?
mitLö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 KeyBinding
s 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"