按下回车键的事件处理程序

65

当按下回车键时,我想从文本框中获取文本内容。我正在使用WPF / Visual Studio 2010 / .NET 4。我不知道在<TextBox>标记中应该使用哪个事件处理程序?我还想对掩码文本框执行相同的操作。


你能展示一下你目前做了什么吗? - tafa
<telerik:RadMaskedTextBox x:Name="maskedtxtbox" Mask="###-##-####"
KeyDown="txtboxSSN_KeyDown" />
- zack
私有的 void maskedtxtbox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { if (e.SystemKey == System.Windows.Input.Key.Enter) { //在此处执行某些操作 - zack
5个回答

116

按键按下或弹起事件。

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

我该如何在 RadMaskedTextBox 上实现它? - zack
RadMaskedTextBox标签内没有“AcceptsReturn”选项。 - zack
没有任何不同。MaskedTextBox有相同的事件处理程序。实际上,所有控件都有它们。 - tafa
@weberc2 KeyPress 没有暴露 KeyCode 属性。 - erikvimz
1
当我使用(e.KeyCode == Keys.Enter)时,会显示错误。应该使用(e.Key == Key.Enter)。 - jithu
显示剩余3条评论

22

你也可以在 WPF 中使用 PreviewKeyDown:

<TextBox PreviewKeyDown="EnterClicked" />

或者在 C# 中:

myTextBox.PreviewKeyDown += EnterClicked;

然后在附加的类中:

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

8

KeyDown事件只会被“普通”输入键触发,如TextBox或MaskedTextBox中的标准输入键,而不包括ENTER或TAB等。

可以通过重写IsInputKey方法来获取特殊键,如ENTER:

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

接下来可以这样使用KeyDown事件:

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

3
在WPF中,除非设置属性AcceptsReturn="True",否则TextBox元素将无法使用“Enter”按钮创建KeyUp事件的机会。
但是,这并不能解决处理TextBox元素中KeyUp事件的问题。按下“ENTER”后,您将在TextBox中获得一个新的文本行。
我通过使用冒泡事件策略来解决TextBox元素使用KeyUp事件的问题。它很简短易懂。您必须在某个(任何)父元素上附加一个KeyUp事件处理程序:
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#逻辑部分(KeyUp事件处理程序附加到网格元素):

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

结果:

显示结果的图片


1

对于那些在文本框或其他输入控件上难以捕获回车键的人来说,如果您的表单定义了AcceptButton,则无法使用KeyDown事件来捕获Enter。

您需要在表单级别捕获Enter键。将以下代码添加到表单中:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接