WPF: uma caixa de texto que tem um evento que é acionado quando a tecla Enter é pressionada
-
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 #)?
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 KeyBinding
s 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"