2012-01-26 22 views
15

W aplikacji WPF mam okno z wieloma polami. Gdy użytkownik użyje klawisza TAB po wypełnieniu każdego pola, system Windows zrozumie, że przechodzi on do następnego. To jest dość znane zachowanie.Jak symulować naciśnięcie klawisza Tab po naciśnięciu przycisku Powrót w aplikacji WPF?

Teraz chcę, aby symulował klawisz TAB, podczas gdy w rzeczywistości POWRÓT zostaje trafiony. Więc w moim WPF XAML dodałem sugerować KeyDown="userPressEnter"

I w kodzie za nim:

private void userPressEnter(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Return) 
    { 
    e.Key = Key.Tab // THIS IS NOT WORKING 
    } 
} 

Teraz oczywiście to nie działa. Ale nie wiem, jak to działa?


EDIT 1 ==> znalazł rozwiązanie

znalazłam coś, co pomogło mi out =)

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

ten sposób ostrości porusza się na następny może ona znajdź :)

+0

Przez symulację zakładki chcesz przesunąć kursor do następnego pola w oknie? – Tudor

+0

Tak, przenieś go do następnego programu obsługi, aby mogło to być pole lub przycisk. Symuluj więc takie samo zachowanie, jakby użytkownik mógł nacisnąć TAB. Dlatego po prostu próbuję nadać systemowi wejście TAB, gdy w rzeczywistości naciśnięto RETURN. – Dante1986

+0

Problem z rozwiązaniem: musisz dodać go do każdego pojedynczego elementu sterującego, w przeciwnym razie funkcja MoveFocus nie wybierze poprawnego następnego pola. – Sam

Odpowiedz

13

Można spojrzeć na post tutaj: http://social.msdn.microsoft.com/Forums/en/wpf/thread/c85892ca-08e3-40ca-ae9f-23396df6f3bd

Oto przykład:

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

hehe właśnie znalazłem to też :) chociaż musiałem zrobić to trochę inaczej, aby to działało;) – Dante1986

1

Myślę, że powinieneś użyć tego do symulacji TAB:

SendKeys.Send("{TAB}"); 

Zamiast

e.Key = Key.Tab 

Źródła: http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx

+1

Wiem, że ta metoda działa dla aplikacji WinForm, ale czy działa również dla WPF? – Tudor

+2

Masz rację, że nie ... Znalazłem to, ale jestem pewien, że istnieje lepsze rozwiązanie http://inputsimulator.codeplex.com/ – Kevin

+0

Znalazłem rozwiązanie, zredagowałem swój pierwszy post. – Dante1986

3
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; 
    } 
+0

To jest rozwiązanie WinForm. SendKeys znajduje się w pliku System.Windows.Forms, a nie w System.Windows dll – Mafii

0

Metoda użycia SelectNextControl twojego formularza

+1

to jest rozwiązanie WinForm – LuckyLikey

Powiązane problemy