How do I simulate a Tab key press when Return is pressed in a WPF application?
Solution 1
You can look at a post here: http://social.msdn.microsoft.com/Forums/en/wpf/thread/c85892ca-08e3-40ca-ae9f-23396df6f3bd
Here's an example:
private void textBox1_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next);
request.Wrapped = true;
((TextBox)sender).MoveFocus(request);
}
}
Solution 2
protected override bool ProcessDialogKey(Keys keyData)
{
System.Diagnostics.Debug.WriteLine(keyData.ToString());
switch (keyData)
{
case Keys.Enter:
SendKeys.Send("{TAB}");
break;
}
base.ProcessDialogKey(keyData);
return false;
}
Solution 3
I think you should use that to simulate TAB :
SendKeys.Send("{TAB}");
Instead of
e.Key = Key.Tab
Sources : http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx
Solution 4
How about make SendKeys Class Working like Winforms.SendKeys
public static class SendKeys
{
public static void Send(Key key)
{
if (Keyboard.PrimaryDevice != null) {
if (Keyboard.PrimaryDevice.ActiveSource != null) {
var e1 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, key) { RoutedEvent = Keyboard.KeyDownEvent };
InputManager.Current.ProcessInput(e1);
}
}
}
}
Solution 5
SendKeys.Send or SendKeys.SendWait will not work in a WPF application, so to answer the original question
if (e.Key == Key.Return)
{
KeyEventArgs tabPressEventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab) { RoutedEvent = Keyboard.KeyDownEvent };
InputManager.Current.ProcessInput(tabPressEventArgs);
}
Dante1986
Updated on July 09, 2022Comments
-
Dante1986 almost 2 years
In a WPF application, i have a window that has a lot of fields. When the user uses the TAB key after filling each field, windows understands that it moves on to the next. This is pretty know behavior.
Now what I want to to, is make it simulate the TAB key, when in fact the RETURN gets hit. So in my WPF xaml I added imply
KeyDown="userPressEnter"
And in the code behind it:
private void userPressEnter(object sender, KeyEventArgs e) { if (e.Key == Key.Return) { e.Key = Key.Tab // THIS IS NOT WORKING } }
Now, obviously this is not working. But what I don't know is, how DO I make this work?
EDIT 1 ==> FOUND A SOLUTION
I found something that helped me out =)
private void userPressEnter(object sender, KeyEventArgs e) { if (e.Key == Key.Return) { TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next); MoveFocus(request); } }
This way the Focus moves on the the next it can find :)
-
Tudor over 12 yearsI know this method works for winforms apps, but does it also work for WPF?
-
Kevin over 12 yearsYou're right it doesn't... I've found this instead but i'm sure there is a better solution inputsimulator.codeplex.com
-
Dante1986 over 12 yearshehe i just found that one too :) although i had to make it a bit different to get it to work ;)
-
Mafii almost 8 yearsThis is a winforms solution. SendKeys is in the System.Windows.Forms dll and not in the System.Windows dll
-
LuckyLikey about 7 yearsthis is a WinForms Solution
-
MikeLimaSierra over 3 yearsThis should be the accepted answer, as none of the other answers actually trigger another tab press event.