WPF: un cuadro de texto que tiene un evento que se activa cuando se presiona la tecla Intro

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

  •  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 #)?

¿Fue útil?

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"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top