web-dev-qa-db-ja.com

WPFアプリケーションでReturnキーが押されたときにTabキーを押すことをシミュレートするにはどうすればよいですか?

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

このようにして、フォーカスは次に見つけることができる場所に移動します:)

17
Dante1986

ここで投稿を見ることができます: 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);
            }
        }
15
Nick Bray
    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;
    }
4
ecklerpa

TABをシミュレートするためにそれを使用する必要があると思います:

SendKeys.Send("{TAB}");

の代わりに

e.Key = Key.Tab

ソース: http://msdn.Microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx

1
Kevin

フォームのメソッドSelectNextControlを使用します

0
sasch

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
최승훈

最善の解決策は次のとおりです。

var ue = e.OriginalSource as FrameworkElement;

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

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
stuicidle