如何在WPF应用程序中按下回车键时模拟Tab键的按下?

21
在一个WPF应用程序中,我有一个包含许多字段的窗口。 当用户在填写每个字段后使用TAB键时,Windows会理解它要移动到下一个字段。这是相当普遍的行为。
现在我想要做的是,当实际上按下RETURN键时,使它模拟TAB键的操作。 因此,在我的WPF xaml中,我添加了KeyDown="userPressEnter" 而在代码背后,则是:
private void userPressEnter(object sender, KeyEventArgs e)
{
  if (e.Key == Key.Return)
  {
    e.Key = Key.Tab // THIS IS NOT WORKING
  }
}

现在,显然这不起作用。但我不知道的是,我应该如何让它工作?


编辑1 ==> 找到了解决方案

我找到了一些帮助我的东西=)

private void userPressEnter(object sender, KeyEventArgs e)
{
 if (e.Key == Key.Return)
 {
   TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next);
   MoveFocus(request);
 }
}

这种方法会使焦点移动到它能找到的下一个位置 :)


你所说的模拟选项卡是指将光标移动到窗口中的下一个字段吗? - Tudor
把它移动到下一个处理程序,这可以是一个字段或一个按钮。模拟与用户按下TAB键相同的行为。这就是为什么我尝试简单地给系统TAB输入,而实际上按下的是RETURN键。 - Dante1986
你的解决方案存在问题:你需要将它添加到每个控件上,否则 MoveFocus 将无法选择正确的下一个字段。 - Sam
7个回答

18

哈哈,我也刚找到这个 :) 不过我得稍微改了一下才能让它工作 ;) - Dante1986

4
如何使SendKeys类像Winforms.SendKeys一样工作?

https://michlg.wordpress.com/2013/02/05/wpf-send-keys/

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

这应该是被接受的答案,因为其他答案都没有实际触发另一个选项卡按键事件。 - MikeLimaSierra
比答案更好的解决方案是:FocusNavigationDirection.Next无法进入可编辑的ComboBox中的下一个控件。 - Lucy82
比答案更好的解决方案 - FocusNavigationDirection.Next无法进入可编辑的ComboBox的下一个控件。 - undefined

4
    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;
    }

1
这是一个WinForms解决方案。SendKeys在System.Windows.Forms dll中,而不在System.Windows dll中。 - Mafii

2

我认为您应该使用这个来模拟TAB:

SendKeys.Send("{TAB}");

不是

e.Key = Key.Tab

来源:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.sendkeys.send.aspx

SendKeys类是一种能够模拟键盘按键的方法,可以用于向当前活动窗口发送任意字符串。使用该方法时需要小心,因为如果发送的字符不被接收方程序所接受,则可能会产生未知的结果。


1
我知道这种方法适用于WinForms应用程序,但它是否也适用于WPF? - Tudor
2
你说得对,它确实不行...我找到了这个替代方案,但我相信还有更好的解决方法http://inputsimulator.codeplex.com/ - Kevin

1
SendKeys.Send或SendKeys.SendWait在WPF应用程序中无法使用,因此要回答原始问题。
if (e.Key == Key.Return)
{    
    KeyEventArgs tabPressEventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab) { RoutedEvent = Keyboard.KeyDownEvent };
    InputManager.Current.ProcessInput(tabPressEventArgs); 
}

0
使用您的表单的SelectNextControl方法。

1
这是一个WinForms解决方案。 - LuckyLikey

0

我认为最好的解决方案是:

var ue = e.OriginalSource as FrameworkElement;

if (e.Key == Key.Return)
{
    e.Handled = true;
    ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接