Как имитировать нажатие клавиши Tab при нажатии Return в приложении WPF? - PullRequest
16 голосов
/ 27 января 2012

В приложении 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);
 }
}

Таким образом Фокус перемещается на следующее, которое он может найти:)

Ответы [ 6 ]

13 голосов
/ 27 января 2012

Вы можете посмотреть пост здесь: 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);
            }
        }
4 голосов
/ 28 октября 2013
    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 голос
/ 27 января 2012

Я думаю, вы должны использовать это для симуляции TAB:

SendKeys.Send("{TAB}");

Вместо

e.Key = Key.Tab

Источники: http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx

0 голосов
/ 27 февраля 2019

Как насчет того, чтобы класс 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);
            }
        }
    }
}
0 голосов
/ 05 июня 2018

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 голосов
/ 17 ноября 2015

Используйте метод SelectNextControl вашей формы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...