2013-03-23 66 views
1

我不知道是否有任何改變從當前控件的焦點,並將其移動到TabIndex分配控件上的WPF中的其他控件。如何在WPF中移動焦點?

示例 我有TabIndex 1到5的控件,有沒有辦法讓焦點從1到5?

<TextBox TabIndex="1" Focusable = "true" LostFocus="test_LostFocus"/> 
<TextBox TabIndex="2" Focusable = "true"/> 
... 
<TextBox TabIndex="5" Focusable = "true" name="LastControl"/> 

private void test_LostFocus(object sender, RoutedEventArgs e) 
{ 
    LastControl.Focus(); 
} 

我試圖Keyboard.Focus()FocusManager.SetFocusedElement(),但沒有運氣。

任何想法?

+0

你在哪裏調用'Focus'方法和你從後臺調用它線? – keyboardP 2013-03-23 14:10:21

+0

@keyboardP我更新了問題。 – Smith 2013-03-23 14:18:13

+0

您確定要使用「LostFocus」事件嗎?用戶可能已經從文本框中點擊了另一個控件。你寧願只是檢查用戶是否按下「tab」/「enter」鍵,然後只設置焦點? – keyboardP 2013-03-23 14:22:50

回答

1

只需處理文本框的KeyDown事件並在其中設置焦點。由於您使用的是Tab,因此控制器知道您將通過設置e.Handled = true來處理該問題,這將停止跳轉到下一個TabIndex控件的默認tab操作。

private void tb_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Tab) 
    { 
     e.Handled = true; 
     LastControl.Focus(); 
    } 
} 
+0

謝謝!我花了整整一天的時間來解決這個問題。 – Smith 2013-03-23 14:42:14

+0

不客氣:) – keyboardP 2013-03-23 14:44:46

2

正如評論所說,KeyDown是一種更好的方式去(引發LostFocus會導致怪異的行爲,如用戶明確點擊第二控制和焦點轉到最後一個代替)...

請確保您將e.Handled設置爲true,儘管..!

這將工作:

private void TextBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
     if (e.Key == Key.Tab) 
     { 
      e.Handled = true; 
      LastControl.Focus(); 
     } 
} 

凡文本框的減速應該是這樣的:

<TextBox TabIndex="1" Focusable = "true" KeyDown="TextBox1_KeyDown"/>