2014-01-20 33 views
0

問題

在我的Windows Phone 8的C#/ XAML應用程序使用.NET 4.5我通過形式試圖「迭代」。換句話說,當用戶按「輸入」鍵時,焦點更改爲另一個TextBoxPasswordBox「Tab鍵」 字段之間使用的TabIndex

如何我的代碼貌似現在

XAML:

<TextBox TabIndex="0" KeyDown="TextBox_KeyDown"/> 
<TextBox TabIndex="1" KeyDown="TextBox_KeyDown"/> 
<TextBox TabIndex="2" KeyDown="TextBox_KeyDown"/> 
<TextBox TabIndex="3" KeyDown="TextBox_KeyDown"/> 
<TextBox TabIndex="4" KeyDown="TextBox_KeyDown"/> 
.... 

C#代碼隱藏:

using System.Windows.Input; 

private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    if (e.Key.Equals(Key.Enter)) 
    { 
     int index = ((TextBox)sender).TabIndex + 1; 
     //and here is what I've been missing 
     //basically the code to select next tabindex 
     //and set focus on it using Focus() method... 
    } 
}  

問題

  1. 如何選擇下一個元素以聚焦於TABINDEX?我知道我應該使用LINQ,選擇usercontrol中的所有文本框,然後選擇帶有tabindex索引的文本框。我慢慢地想到了我自己(也通過與評論中的人討論),但因爲它花了很長時間我寫了問題:)

*(另外,我不確定如何命名的問題,感到自由,如果你認爲你的名字更符合它重新命名它)

解決方案基於薩查的回答

LayoutRoot是用戶控件

private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     if (e.Key.Equals(Key.Enter)) 
     { 
      int index = ((TextBox)sender).TabIndex + 1; 
      var nextBox = LayoutRoot.Children.OfType<TextBox>().FirstOrDefault((x) => { return x.TabIndex == index; }); 

      if (nextBox != null) 
      { 
       nextBox.Focus(); 
      } 
     } 
    } 
的主網0

非常感謝! :)

+0

我不是最好的在XAML,但在問題風格方面,我看不出問題。看起來你正以同樣的方式接近它 - 你到現在爲止感到不滿嗎?你的代碼評論似乎回答了我以爲你問的問題。 –

+0

第一個問題是「如何選擇下一個元素來聚焦TABINDEX?」 :) – mishan

+1

那麼你有發送者,所以我假設會有一種方法來評估屬性/屬性的值(即TabIndex)。所以你所需要做的就是增加TabIndex來確定哪個文本框應該是'下一個',當你的If語句的計算結果爲真時 - 重點關注它。 –

回答

6

這是一個可能的實現。

<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" 
      > 
    <TextBox TabIndex="0" KeyDown="OnKeyDown"/> 
    <TextBox TabIndex="1" KeyDown="OnKeyDown"/> 
    <TextBox TabIndex="2" KeyDown="OnKeyDown"/> 
    <TextBox TabIndex="3" KeyDown="OnKeyDown"/> 
    <TextBox TabIndex="4" KeyDown="OnKeyDown"/> 
</StackPanel> 

下面的代碼假定ContentPanel僅包含TextBox。這取決於你在它增加更多的智能代碼...

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key.Equals(Key.Enter)) 
    { 
     var txtBox = sender as TextBox; 
     var index = txtBox.TabIndex; 

     var nextTextBox = ContentPanel.Children.Cast<TextBox>().FirstOrDefault(t => t.TabIndex == index + 1); 

     if (nextTextBox != null) 
     { 
      nextTextBox.Focus(); 
     } 
    } 
} 
+0

謝謝,我主要在尋找linq部分,因爲我不太瞭解它。這對我有很大的幫助。 – mishan

+1

+1。這是我懷疑解決方案的樣子。 –

+2

但是在我的實現中,我將'Cast '更改爲'OfType ()'.. :) – mishan

1

你甚至不需要命名ContentPanel

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key.Equals(Key.Enter)) 
    { 
     var currentBox = (TextBox)sender; 
     var container = currentBox.Parent; 
     var index = currentBox.TabIndex + 1; 
     var nextBox = container.ChildrenOfType<TextBox>().FirstOrDefault(box => box.TabIndex == index); 

     if (nextBox != null) 
     { 
      nextBox.Focus(); 
     } 
    } 
} 
4

如果它有助於任何人,在8.1(唐」噸知道它是否也適用於8)你可以這樣做:

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key.Equals(Key.Enter)) 
    { 
     FocusManager.TryMoveFocus(FocusNavigationDirection.Next); 
    } 
}