2010-09-20 9 views
38

Je veux capturer le texte de la zone de texte lorsque la touche Entrée est atteinte. J'utilise WPF/Visual Studio 2010/.NET 4. Je ne sais pas quel gestionnaire d'événement à utiliser dans le tag? Je veux aussi faire la même chose pour maskedtextbox.Entrée touche pressée gestionnaire d'événements

+0

Pouvez-vous nous montrer ce que vous avez fait jusqu'à présent? – tafa

+0

zack

+0

private void maskedtxtbox_KeyDown (expéditeur d'objet, System.Windows.Input.KeyEventArgs e) { if (e.SystemKey == System.Windows.Input.Key.Enter) {// faire quelque chose ici – zack

Répondre

74

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 
    } 
} 
+0

Comment puis-je le faire pour le maskedtextbox? sa radmaskedtextbox – zack

+0

la radmaskedtextbox ne donne pas une option de "AcceptsReturn" à l'intérieur de l'étiquette .. – zack

+0

Rien ne serait différent. MaskedTextBox a les mêmes gestionnaires d'événement. En fait, tous les contrôles les ont. – tafa

6

L'événement KeyDown ne déclenche à la zone de texte standard ou MaskedTextBox par des touches d'entrée « normales », et non ENTRER ou TAB et ainsi de suite.

On peut obtenir des touches spéciales comme ENTRER en remplaçant 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); 
      } 
    } 
} 
17

Vous pouvez également utiliser PreviewKeyDown dans WPF :

<TextBox PreviewKeyDown="EnterClicked" /> 

ou en C#:

myTextBox.PreviewKeyDown += EnterClicked; 

Et puis dans la classe ci-joint:

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

En WPF, élément TextBox ne se occasion d'utiliser le bouton « Enter » pour créer KeyUp événement jusqu'à ce que vous ne définissez la propriété: AcceptsReturn = « true » . Mais, cela ne résoudrait pas le problème de gestion de KeyUp Event dans l'élément TextBox. Après avoir appuyé sur "ENTER" vous obtiendrez une nouvelle ligne de texte dans TextBox.

J'ai résolu le problème de l'utilisation de l'élément KeyUp Event de TextBox en utilisant la stratégie d'événement Bubble. C'est court et facile. Il faut attacher un gestionnaire d'événement KeyUp dans certains (tout) élément parent:

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> 

C# partie logique (KeyUp gestionnaire d'événement est fixé à un élément de 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 with result

Questions connexes