Voer gebeurtenisafhandeling in met ingedrukte toets

Ik wil de tekst uit het tekstvak halen wanneer op de enter-toets wordt gedrukt. Ik gebruik WPF/visual studio 2010/.NET 4. Ik weet niet welke gebeurtenishandler in de tag moet worden gebruikt? Ik wil ook hetzelfde doen voor maskedtextbox.


Antwoord 1, autoriteit 100%

KeyDown of 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
    }
}

Antwoord 2, autoriteit 21%

U kunt PreviewKeyDown ook gebruiken in WPF:

<TextBox PreviewKeyDown="EnterClicked" />

of in C#:

myTextBox.PreviewKeyDown += EnterClicked;

En dan in de bijgevoegde klas:

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

Antwoord 3, autoriteit 6%

De KeyDown-gebeurtenis wordt alleen geactiveerd bij de standaard TextBox of MaskedTextBox door “normale” invoertoetsen, niet ENTER of TAB enzovoort.

Je kunt speciale toetsen zoals ENTER krijgen door de IsInputKey-methode te overschrijven:

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

Dan kan men de KeyDown-gebeurtenis op de volgende manier gebruiken:

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

Antwoord 4, autoriteit 3%

In WPF krijgt het TextBox-element geen gelegenheid om de “Enter”-knop te gebruiken voor het maken van een KeyUp-gebeurtenis totdat u de eigenschap: AcceptsReturn=”True” niet instelt.

Maar het zou het probleem met het verwerken van KeyUp Event in TextBox-element niet oplossen. Nadat u op “ENTER” heeft gedrukt, krijgt u een nieuwe tekstregel in TextBox.

Ik had het probleem van het gebruik van KeyUp Event van het TextBox-element opgelost door de Bubble-gebeurtenisstrategie te gebruiken. Het is kort en gemakkelijk. U moet een KeyUp Event-handler koppelen aan een (elk) bovenliggend element:

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# logisch onderdeel (KeyUp Event handler is gekoppeld aan een rasterelement):

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

Resultaat:

Afbeelding met resultaat


Antwoord 5

Voor degenen die moeite hebben met het vastleggen van de Enter-toets op TextBox of een ander invoerbesturingselement, als uw formulier AcceptButton heeft gedefinieerd, kunt u de KeyDown-gebeurtenis niet gebruiken om Enter vast te leggen.

Wat u moet doen, is de Enter-toets op formulierniveau vangen. Voeg deze code toe aan het formulier:

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

Other episodes