web-dev-qa-db-fra.com

Entrer touche gestionnaire d'événements pressés

Je veux capturer le texte de la zone de texte lorsque vous appuyez sur la touche Entrée. J'utilise WPF/visual studio 2010/.NET 4. Je ne sais pas quel gestionnaire d'événements utiliser dans la balise? Je veux aussi faire la même chose pour maskedtextbox.

48
zack

KeyDown ou KeyUp.

TextBox tb = new TextBox();
tb.KeyDown += new KeyEventHandler(tb_KeyDown);

static void tb_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        //enter key is down
    }
}
92
tafa

Vous pouvez également utiliser PreviewKeyDown dans WPF:

<TextBox PreviewKeyDown="EnterClicked" />

ou en C #:

myTextBox.PreviewKeyDown += EnterClicked;

Et puis dans la classe ci-jointe:

void EnterClicked(object sender, KeyEventArgs e) {
    if(e.Key == Key.Return) {
        DoSomething();
        e.Handled = true;
    }
}
21
Stuart

L'événement KeyDown est uniquement déclenché sur la TextBox standard ou la MaskedTextBox par des clés d'entrée "normales", et non par ENTER ou TAB, etc.

On peut obtenir des clés spéciales comme ENTER en substituant la méthode IsInputKey:

public class CustomTextBox : System.Windows.Forms.TextBox
{
    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Return)
            return true;
        return base.IsInputKey(keyData);
    }
}

Ensuite, on peut utiliser l'événement KeyDown de la manière suivante:

CustomTextBox ctb = new CustomTextBox();
ctb.KeyDown += new KeyEventHandler(tb_KeyDown);

private void tb_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
          //Enter key is down

          //Capture the text
          if (sender is TextBox)
          {
              TextBox txb = (TextBox)sender;
              MessageBox.Show(txb.Text);
          }
    }
}
7
riv

Dans WPF, l'élément TextBox n'aura pas la possibilité d'utiliser le bouton "Entrée" pour créer un événement KeyUp tant que vous ne définissez pas la propriété: AcceptsReturn = "True".

Mais cela ne résoudrait pas le problème de la gestion de l'événement KeyUp dans l'élément TextBox. Après avoir appuyé sur "Entrée", vous obtiendrez une nouvelle ligne de texte dans TextBox.

J'avais résolu le problème d'utilisation de KeyUp Event de l'élément TextBox en utilisant la stratégie des événements Bubble. C'est court et facile. Vous devez attacher un gestionnaire d’événement KeyUp à un élément parent (n’importe lequel):

XAML:

<Window x:Class="TextBox_EnterButtomEvent.MainWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.Microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:TextBox_EnterButtomEvent"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid KeyUp="Grid_KeyUp">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height ="0.3*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Row="1" Grid.Column="1" Padding="0" TextWrapping="WrapWithOverflow">
        Input text end press ENTER:
    </TextBlock>
    <TextBox Grid.Row="2" Grid.Column="1" HorizontalAlignment="Stretch"/>
    <TextBlock Grid.Row="4" Grid.Column="1" Padding="0" TextWrapping="WrapWithOverflow">
        You have entered:
    </TextBlock>
    <TextBlock Name="txtBlock" Grid.Row="5" Grid.Column="1" HorizontalAlignment="Stretch"/>
</Grid></Window>

Partie logique C # (le gestionnaire d'événements KeyUp est attaché à un élément de la grille):

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Grid_KeyUp(object sender, KeyEventArgs e)
    {
        if(e.Key == Key.Enter)
        {
            TextBox txtBox = e.Source as TextBox;
            if(txtBox != null)
            {
                this.txtBlock.Text = txtBox.Text;
                this.txtBlock.Background = new SolidColorBrush(Colors.LightGray);
            }
        }
    }
}

RÉSULTAT:

Image avec résultat

3

Pour ceux qui ont du mal à capturer la touche Entrée de la zone de texte ou un autre contrôle de saisie, si votre formulaire a AcceptButton défini, vous ne pourrez pas utiliser l'événement KeyDown pour capturer Entrée.

Ce que vous devez faire est d’attraper la touche Entrée au niveau du formulaire. Ajoutez ce code au formulaire:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if ((this.ActiveControl == myTextBox) && (keyData == Keys.Return))
    {
        //do something
        return true;
    }
    else
    {
        return base.ProcessCmdKey(ref msg, keyData);
    }
}
0
AecorSoft