2012-01-26 33 views
15

Trong một ứng dụng WPF, tôi có một cửa sổ có nhiều trường. Khi người dùng sử dụng phím TAB sau khi điền vào từng trường, cửa sổ hiểu rằng nó sẽ chuyển sang trường tiếp theo. Đây là hành vi khá biết.Làm cách nào để mô phỏng phím bấm Tab khi Return được nhấn trong ứng dụng WPF?

Bây giờ những gì tôi muốn, là làm cho nó mô phỏng phím TAB, khi trên thực tế RETURN được nhấn. Vì vậy, trong XAML WPF tôi thêm bao hàm KeyDown="userPressEnter"

Và trong mã đằng sau nó:

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

Bây giờ, rõ ràng đây không phải là làm việc. Nhưng những gì tôi không biết là, làm thế nào để tôi thực hiện công việc này?


EDIT 1 ==> tìm ra giải pháp

tôi tìm thấy một cái gì đó đã giúp tôi ra =)

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

Bằng cách này, Focus di chuyển trên tiếp theo nó có thể tìm :)

+0

Bằng cách mô phỏng tab bạn muốn di chuyển con trỏ đến trường tiếp theo trong cửa sổ? – Tudor

+0

Yea, di chuyển nó sang trình xử lý tiếp theo, để có thể là một trường hoặc một nút. Vì vậy, mô phỏng hành vi tương tự như nếu người dùng có thể đã nhấn TAB. Đó là lý do tại sao tôi chỉ đơn giản là cố gắng cung cấp cho hệ thống đầu vào TAB, khi thực tế RETURN được nhấn. – Dante1986

+0

Vấn đề của giải pháp của bạn: Bạn cần thêm nó vào mọi điều khiển đơn, nếu không MoveFocus sẽ không chọn đúng trường tiếp theo. – Sam

Trả lời

13

Bạn có thể nhìn vào một bài đăng ở đây: http://social.msdn.microsoft.com/Forums/en/wpf/thread/c85892ca-08e3-40ca-ae9f-23396df6f3bd

Dưới đây là một ví dụ:

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 tôi chỉ thấy rằng một trong những quá :) mặc dù tôi đã phải làm cho nó một chút khác nhau để có được nó để làm việc;) – Dante1986

1

Tôi nghĩ bạn nên sử dụng điều đó để mô phỏng TAB:

SendKeys.Send("{TAB}"); 

Thay vì

e.Key = Key.Tab 

Nguồn: http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx

+1

Tôi biết phương pháp này hoạt động cho các ứng dụng winforms, nhưng nó cũng làm việc cho WPF? – Tudor

+2

Bạn nói đúng không ... Tôi đã tìm thấy điều này thay vào đó nhưng tôi chắc rằng có một giải pháp tốt hơn http://inputsimulator.codeplex.com/ – Kevin

+0

Tìm thấy giải pháp, đã chỉnh sửa bài đăng đầu tiên của tôi. – 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

Đây là một giải pháp winforms. SendKeys nằm trong tệp System.Windows.Forms và không có trong System.Windows dll – Mafii

0

Phương thức sử dụng SelectNextControl Form của bạn

+1

đây là giải pháp WinForms – LuckyLikey

Các vấn đề liên quan