WPF: un cuadro de texto que tiene un evento que se activa cuando se presiona la tecla Intro
-
03-07-2019 - |
Pregunta
En lugar de adjuntar un evento PreviewKeyUp
con cada TextBox
en mi aplicación y verificar si la tecla presionada era una tecla Enter y luego realizar una acción, decidí implementar versión de un TextBox
que incluye un evento DefaultAction que se activa cuando se presiona una tecla Intro en un TextBox
.
Lo que hice básicamente fue crear una nueva Clase que se extiende desde TextBox
con un evento público DefaultAction
, como por ejemplo:
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);
}
}
Luego uso este cuadro de texto personalizado desde mi aplicación como (xaml):
<Controls:DefaultTextBoxControl DefaultAction="DefaultTextBoxControl_DefaultAction">
</Controls:DefaultTextBoxControl>
Ahora, en mi pequeña experiencia que he tenido al aprender WPF, me he dado cuenta de que casi la mayoría de las veces hay un "enfriador". (y esperamos que sea más fácil) una forma de implementar las cosas
... así que mi pregunta es, ¿Cómo puedo mejorar el control anterior? ¿O tal vez hay otra forma en que pueda hacer el control anterior? ... ¿tal vez solo use código declarativo en lugar de declarativo (xaml) y de procedimiento (C #)?
Solución
Eche un vistazo a esta publicación de blog desde un Hace unos meses, adjunto un controlador de eventos 'global' a TextBox.GotFocus
para seleccionar el texto.
Esencialmente, puede manejar el evento KeyUp
en su clase de aplicación, así:
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");
}
... y ahora todos los TextBox
en su aplicación llamarán al método TextBox_KeyUp
a medida que los usuarios escriban en ellos.
Update
Como ha señalado en su comentario, esto solo es útil si cada TextBox
necesita ejecutar el mismo código.
Para agregar un evento arbitrario como presionar una tecla Intro, es mejor que busque en Eventos adjuntos . Creo que esto puede conseguirte lo que quieres.
Otros consejos
Desde que se hizo esta pregunta, ahora hay una propiedad InputBindings
en TextBoxes y otros controles. Con esto, se puede usar una solución puramente XAML, en lugar de usar controles personalizados. La asignación de KeyBinding
s para Return
y Enter
para apuntar a un comando puede hacer esto.
Ejemplo:
<TextBox Text="Test">
<TextBox.InputBindings>
<KeyBinding Command="{Binding SomeCommand}" Key="Return" />
<KeyBinding Command="{Binding SomeCommand}" Key="Enter" />
</TextBox.InputBindings>
</TextBox>
Algunos han mencionado que Enter
no siempre funciona y que Return
puede usarse en algunos sistemas.
Cuando el usuario presiona la tecla Intro en el cuadro de texto, la entrada en el cuadro de texto aparece en otra área de la interfaz de usuario (IU).
El siguiente XAML crea la interfaz de usuario, que consta de un StackPanel, un TextBlock y un TextBox.
<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>
El siguiente código detrás crea el controlador de eventos KeyDown. Si la tecla que se presiona es la tecla Intro, se muestra un mensaje en TextBlock.
private void OnKeyDownHandler(object sender, KeyEventArgs e)
{
if (e.Key == Key.Return)
{
textBlock1.Text = "You Entered: " + textBox1.Text;
}
}
Para obtener más información, lea MSDN Doc
private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
{
string etr = e.Key.ToString();
if (etr == "Return")
{
MessageBox.Show("You Press Enter");
}
}
agregue el evento en xaml
al cuadro de texto u objeto específico:
KeyDown="txtBarcode_KeyDown"