input按键事件处理程序
input密钥时,我想从文本框中捕获文本。 我正在使用WPF / Visual Studio 2010 / .NET 4.我不知道在标签中使用什么事件处理程序? 我也想为maskedtextbox做同样的事情。
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 } }
您也可以在WPF中使用PreviewKeyDown:
<TextBox PreviewKeyDown="EnterClicked" />
或在C#中:
myTextBox.PreviewKeyDown += EnterClicked;
然后在所附的课堂上:
void EnterClicked(object sender, KeyEventArgs e) { if(e.Key == Key.Return) { DoSomething(); e.Handled = true; } }
KeyDown事件只在标准的TextBox或MaskedTextBox上通过“普通”input键触发,而不是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); } } }
在WPF中,TextBox元素将不会获得使用“Enter”button创buildKeyUp事件的机会,除非您不设置属性: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); } } } }
结果:
图像与结果