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

时间:2012-01-26 21:01:09

标签: c# wpf keypress

在WPF应用程序中,我有一个包含很多字段的窗口。 当用户在填充每个字段后使用TAB键时,Windows会理解它会移动到下一个字段。这是非常了解的行为。

现在我想要的是,让它模拟TAB键,实际上RETURN被击中。 所以在我的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);
 }
}

这样,焦点会移动到它可以找到的下一个:)

7 个答案:

答案 0 :(得分:13)

您可以在此处查看帖子: http://social.msdn.microsoft.com/Forums/en/wpf/thread/c85892ca-08e3-40ca-ae9f-23396df6f3bd

以下是一个例子:

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

答案 1 :(得分: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;
    }

答案 2 :(得分:1)

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

SendKeys.Send("{TAB}");

而不是

e.Key = Key.Tab

资料来源:http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx

答案 3 :(得分:0)

使用表单的方法SelectNextControl

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如何使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);
            }
        }
    }
}

答案 6 :(得分:0)

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

var ue = e.OriginalSource as FrameworkElement;

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