【问题标题】:Enter key pressed event handler输入按键事件处理程序
【发布时间】:2010-09-20 14:33:55
【问题描述】:

我想在按下回车键时从文本框中捕获文本。我正在使用 WPF/visual studio 2010/.NET 4。我不知道要在标签中使用什么事件处理程序?我也想对 maskedtextbox 做同样的事情。

【问题讨论】:

  • 你能告诉我们你到目前为止做了什么吗?
  • private void maskedtxtbox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { if (e.SystemKey == System.Windows.Input.Key.Enter) { //在这里做点什么跨度>

标签: c# wpf user-interface textbox maskedtextbox


【解决方案1】:

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

【讨论】:

  • 我如何为蒙版文本框做这件事?它是一个 radmaskedtextbox
  • radmaskedtextbox 在标签内没有给出“AcceptsReturn”选项..
  • 没有什么不同。 MaskedTextBox 具有相同的事件处理程序。事实上,所有控件都有它们。
  • 这个处理程序会在按下任何键时被触发。我只想在按下 enter 时触发事件。然后我想收集文本框中的内容。所以这就是它的作用。用户输入名称并按回车键。那是我想触发事件的时候。而不是在用户输入他的名字时..我希望这能解释它..
  • (e.KeyCode == Keys.Enter) 当我使用它时显示 error.instead (e.Key == Key.Enter)。
【解决方案2】:

您也可以在 WPF 中使用 PreviewKeyDown:

<TextBox PreviewKeyDown="EnterClicked" />

或在 C# 中:

myTextBox.PreviewKeyDown += EnterClicked;

然后在附加类中:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在 WPF 中,TextBox 元素将没有机会使用“Enter”按钮来创建 KeyUp 事件,除非您不会设置属性:AcceptsReturn="True"。

      但是,它不能解决在 TextBox 元素中处理 KeyUp 事件的问题。按“ENTER”后,您将在 TextBox 中获得一个新的文本行。

      我通过使用 Bubble 事件策略解决了使用 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);
                  }
              }
          }
      }
      

      结果:

      【讨论】:

        【解决方案5】:

        对于那些难以在 TextBox 或其他输入控件上捕获 Enter 键的人,如果您的 Form 定义了 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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-30
          • 2022-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多