我想在点击输入键时从文本框中捕获文本。我正在使用WPF / visual studio 2010 / .NET 4.我不知道在标签中使用什么事件处理程序?我也想为maskedtextbox做同样的事情。
答案 0 :(得分:88)
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
}
}
答案 1 :(得分:20)
您还可以在WPF中使用PreviewKeyDown:
<TextBox PreviewKeyDown="EnterClicked" />
或在C#中:
myTextBox.PreviewKeyDown += EnterClicked;
然后在附加的课程中:
void EnterClicked(object sender, KeyEventArgs e) {
if(e.Key == Key.Return) {
DoSomething();
e.Handled = true;
}
}
答案 2 :(得分: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);
}
}
}
答案 3 :(得分:3)
在WPF中,TextBox元素将无法使用&#34;输入&#34;用于创建KeyUp事件的按钮,直到您不设置属性为止:AcceptsReturn =&#34; True&#34;。
但是,它不会解决在TextBox元素中处理KeyUp Event的问题。按下&#34; ENTER&#34;您将在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);
}
}
}
}
结果:
答案 4 :(得分:0)
对于那些难以在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);
}
}