首页 文章

输入按键事件处理程序

提问于
浏览
44

我想在输入键被击中时从文本框中捕获文本 . 我正在使用WPF / visual studio 2010 / .NET 4.我不知道在标签中使用什么事件处理程序?我也想为maskedtextbox做同样的事情 .

4 回答

  • 86

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

    您还可以在WPF中使用PreviewKeyDown:

    <TextBox PreviewKeyDown="EnterClicked" />
    

    或者在C#中:

    myTextBox.PreviewKeyDown += EnterClicked;
    

    然后在附加课程中:

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

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

    在WPF中,TextBox元素将无法使用“Enter”按钮创建KeyUp事件,直到您不设置属性:AcceptsReturn =“True” .

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

    我通过使用Bubble事件策略解决了使用TextBox元素的KeyUp Event的问题 . 这很简单 . 您必须在某个(任何)父元素中附加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);
                }
            }
        }
    }
    

    结果:

    Image with result

相关问题