Easy in WPF and code as below:
private void textBox1_PreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e) { if (e.Key == System.Windows.Input.Key.Enter) { // Your button click event here } }
Instead of attaching a PreviewKeyUp event with each TextBox in my app and checking if the pressed key was an Enter key and then do an action, I decided to implement extended version of a TextBox that includes a DefaultAction event that fires when an Enter Key is pressed in a TextBox.
What I did was basically create a new Class that extends from TextBox with a public event DefaultAction, like such:
public class DefaultTextBoxControl:TextBox
{
public event EventHandler<EventArgs> DefaultAction = delegate { };
public DefaultTextBoxControl()
{
PreviewKeyUp += DefaultTextBoxControl_PreviewKeyUp;
}
void DefaultTextBoxControl_PreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key != Key.Enter)
{
return;
}
DefaultAction(this, EventArgs.Empty);
}
}
I then use this custom textbox from my app like such (xaml):
<Controls:DefaultTextBoxControl DefaultAction="DefaultTextBoxControl_DefaultAction">
</Controls:DefaultTextBoxControl>
Now in my little experience I've had in learning WPF I've realized that almost most of the time there is a "cooler" (and hopefully easier) way to implement things
...so my question is, How can I improve the above control? Or maybe is there another way I can do the above control? ...maybe using only declarative code instead of both declarative (xaml) and procedural (C#) ?
Have a look at this blog post from a few months back where I attach a 'global' event handler to TextBox.GotFocus to select the text.
Essentially you can handle the KeyUp event in your App class, like this:
protected override void OnStartup(StartupEventArgs e)
{
EventManager.RegisterClassHandler(typeof(TextBox),
TextBox.KeyUpEvent,
new System.Windows.Input.KeyEventHandler(TextBox_KeyUp));
base.OnStartup(e);
}
private void TextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key != System.Windows.Input.Key.Enter) return;
// your event handler here
e.Handled = true;
MessageBox.Show("Enter pressed");
}
... and now every TextBox in your application will call the TextBox_KeyUp method as users type into them.
Update
As you've pointed out in your comment, this is only useful if every TextBox needs to execute the same code.
To add an arbitrary event like an Enter keypress, you might be better off looking into Attached Events. I believe this can get you what you want.
http://www.netboffin.com/pages/WPFCaptureEnter.php
Capturing the Enter Key in the WPF textbox control
Unlike the visual basic forms textbox control, the WPF textbox control does not have a keypress event. So how do we know when the user has pressed the Enter key while the textbox has focus?
Here's how its done on a standard windows form in vb.net
Private Sub TextBox1_KeyPress(ByVal sender As Object,
ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
If (e.KeyChar = vbCr) Then
CheckedListBox1.Items.Add(TextBox1.Text)
TextBox1.Text = ""
e.Handled = True
End If
End Sub
And here's how we do it with a WPF textbox control.We use the PreviewKeyUp Event and the Key property of e the KeyEventArgs, comparing it to Key.Enter.
Private Sub TextBox1_PreviewKeyUp(ByVal sender As Object,
ByVal e As System.Windows.Input.KeyEventArgs) Handles TextBox1.PreviewKeyUp
If (e.Key = Key.Enter) Then
ListBox1.Items.Add(TextBox1.Text)
TextBox1.Text = ""
e.Handled = True
End If
End Sub
本文介绍如何在WPF应用程序中使用多种方法捕获并响应TextBox内的Enter键按下事件,包括通过自定义控件、全局事件处理以及附加事件。
5609

被折叠的 条评论
为什么被折叠?



