wpf - teclas - Capturando la tecla Enter en un TextBox
evento para tecla enter c# (5)
En mi vista de WPF, intento vincular un evento a la tecla Intro de la siguiente manera:
<TextBox Width="240" VerticalAlignment="Center" Margin="2" Text="{Binding SearchCriteria, Mode=OneWayToSource}">
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding EnterKeyCommand}"/>
<KeyBinding Key="Tab" Command="{Binding TabKeyCommand}"/>
</TextBox.InputBindings>
</TextBox>
Este código funciona y mi EnterKeyCommand se activa cuando los usuarios presionan la tecla Enter. Sin embargo, el problema es que cuando se desencadena el evento, WPF aún no ha vinculado el texto en el cuadro de texto a ''SearchCriteria''. Entonces, cuando mi evento se activa, el contenido de ''SearchCriteria'' está en blanco. ¿Hay algún cambio simple que pueda hacer en este código para que pueda obtener el contenido del cuadro de texto cuando se active mi comando EnterKey?
Necesita cambiar el UpdateSourceTrigger
en su enlace TextBox.Text
a PropertyChanged
. Mira here .
Puede hacer esto pasando la propiedad InputBindings
de TextBox como un CommandParameter
de Command
al Command
:
<TextBox x:Name="MyTextBox">
<TextBox.InputBindings>
<KeyBinding Key="Return"
Command="{Binding MyCommand}"
CommandParameter="{Binding ElementName=MyTextBox, Path=Text}"/>
</TextBox.InputBindings>
</TextBox>
Sé que esto tiene 6 años, pero ninguna de las respuestas arroja la respuesta correcta en su totalidad usando XAML y sin código subyacente. Todavía tenía trabajo por hacer. Como referencia, el enfoque es el siguiente. Primero el XAML
<TextBox Text="{Binding SearchText, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding SearchEnterHit}"/>
<KeyBinding Key="Return" Command="{Binding SearchEnterHit}"/>
</TextBox.InputBindings>
</TextBox>
Básicamente, el enfoque es que todas las claves se lanzan al SearchText encuadernado con cada pulsación de tecla. Por lo tanto, la cadena estará completamente presente en SearchText una vez que se presiona return / enter. Por lo tanto, en el comando SearchEnterHit, toda la cadena dentro del TextBox está disponible a través de la propiedad SearchText.
Como se mencionó anteriormente, UpdateSourceTrigger = PropertyChanged es lo que vacía cada pulsación de tecla en la propiedad SearchText . KeyBindings captura la tecla enter.
Este es realmente el medio más simple de hacer esto sin código subyacente y todo XAML. Seguro que está descargando las claves de la propiedad SearchText a menudo, pero eso generalmente no es un problema.
También puedes hacer esto en el código detrás.
Cómo: Detectar cuando la tecla Intro presiona
En el control de entrada / retorno, solo invoque el código de su controlador de eventos.
También se puede hacer como un evento asíncrono. Aquí está el ejemplo.
tbUsername.KeyDown += async (s, e) => await OnKeyDownHandler(s, e);
private async Task OnKeyDownHandler(object sender, KeyEventArgs e)
{
if (e.Key == Key.Return)
{
if (!string.IsNullOrEmpty(tbUsername.Text) && !string.IsNullOrEmpty(tbPassword.Password))
{
Overlay.Visibility = Visibility.Visible;
await Login();
}
}
}