WPF: uma caixa de texto que tem um evento que é acionado quando a tecla Enter é pressionada

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Em vez de anexar um evento PreviewKeyUp com cada TextBox em meu aplicativo e verificar se a tecla pressionada era uma tecla Enter e, em seguida, fazer uma ação, eu decidi implementar versão estendida de um TextBox que inclui um evento DefaultAction que é acionado quando um Enter tecla é pressionada numa TextBox.

O que eu fiz foi, basicamente, criar uma nova classe que se estende desde TextBox com um DefaultAction evento público, como tal:

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);
    }
}

Eu, então, usar essa caixa de texto personalizada do meu aplicativo como tal (XAML):

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

Agora, em minha pequena experiência que eu tive em aprender WPF eu percebi que quase a maioria do tempo há um "cooler" (e, esperamos mais fácil) maneira de implementar coisas

... então a minha pergunta é, Como posso melhorar o controle acima? Ou talvez há outra maneira que eu possa fazer o controle acima? ... talvez usando apenas código declarativa em vez de ambos declarativa (XAML) e processual (C #)?

Foi útil?

Solução

Tenha um olhar em este post de um alguns meses atrás, onde eu anexar um manipulador de eventos 'global' para TextBox.GotFocus para selecionar o texto.

Essencialmente, você pode manipular o evento KeyUp em sua classe App, como este:

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");
}

... e agora cada TextBox em seu aplicativo irá chamar o método TextBox_KeyUp como tipo de usuários para eles.

Atualizar

Como você destacou em seu comentário, este só é útil se cada TextBox necessidades para executar o mesmo código.

Para adicionar um evento arbitrária como uma pressão de tecla Enter, você pode ser melhor fora olhando para eventos anexados . Eu acredito que este pode obter o que você quer.

Outras dicas

Uma vez que esta pergunta foi feita, há agora uma propriedade InputBindings em caixas de texto e outros controles. Com isso, uma solução puramente XAML pode ser usado, em vez de usar controles personalizados. Atribuindo KeyBindings para Return e Enter para apontar para um comando pode fazer isso.

Exemplo:

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

Alguns mencionaram que Enter nem sempre funciona, e Return pode ser usado em alguns sistemas.

Quando o usuário pressiona a tecla Enter na caixa de texto, a entrada nos aparece caixa de texto em outra área da interface de usuário (UI).

O XAML a seguir cria a interface de utilizador, a qual consiste de um StackPanel, um TextBlock, e uma caixa de texto.

<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>

O código a seguir para trás cria o manipulador de eventos KeyDown. Se a tecla pressionada é a tecla Enter, uma mensagem é exibida no TextBlock.

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

Para obter mais informações, leia MSDN Doc

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

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

adicionar evento em xaml à caixa de texto ou objeto específico:

KeyDown="txtBarcode_KeyDown"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top