2016-01-25 76 views
3

我有通用Windows 10應用程序中的文本框ListView。我想編寫代碼:其中用戶正在編輯Listiew中的任何文本框,然後單擊輸入鍵,我想將焦點移動到ListView中的下一個TextBox(我想採取與用戶單擊Tab鍵時發生的操作相同的操作)。UWP焦點控制

我的問題是:如何以編程方式將焦點移動到下一個ListView控件元素

+1

當我們按Tab鍵時,焦點在ListViewItem中改變,並且不會移動到下一個ListViewItem,所以我不確定你想要做什麼。你想讓Enter鍵像Tab鍵一樣嗎?或者當我們按下Enter鍵時,焦點移動到下一個ListViewItem中的文本框? –

+0

您是否希望Enter鍵起作用像Tab鍵?或者當我們按下Enter鍵時,焦點移動到下一個ListViewItem中的文本框? - 一個展位。例如:ListViewItem包含五個文本框,從開始的焦點位於第一個ListViewItem的第一個TextBox上。如果我按下EnterKey,焦點停留在當前的ListViewItem中,但移動到下一個TextBox。如果foxus在最後一個TextBox上,按下EnterKey後,foxus被移動到下一個ListViewItem及其第一個TextBox。 – Pawel

回答

1

假設我們有這樣一個模型對象,因此:

public sealed class Item 
{ 
    public string Value { get; set; } 
} 

讓我們來填補他們的串的ListView

<ListView x:Name="listView"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Value}" Loaded="OnTextBoxLoaded" /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
    <ListView.Items> 
     <local:Item Value="One" /> 
     <local:Item Value="Two" /> 
     <local:Item Value="Three" /> 
     <local:Item Value="Four" /> 
    </ListView.Items> 
</ListView> 

代碼隱藏:

public sealed partial class MainPage 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void OnTextBoxLoaded(object sender, RoutedEventArgs e) 
    { 
     TextBox textBox = (TextBox)sender; 
     textBox.KeyUp += (o, args) => 
      { 
       if (args.Key == VirtualKey.Enter) 
       { 
        TextBox originalSource = (TextBox)args.OriginalSource; 
        int index = 0; 
        var items = listView.Items; 
        if (items != null) 
        { 
         foreach (Item item in items) 
         { 
          if (originalSource.DataContext == item) 
          { 
           break; 
          } 

          ++index; 
         } 

         index = (index + 1) % items.Count; 
         ListViewItem container = (ListViewItem)listView.ContainerFromIndex(index); 
         TextBox nextTextBox = FindVisualChild<TextBox>(container); 
         nextTextBox?.Focus(FocusState.Programmatic); 
        } 
       } 
      }; 
    } 

    private static T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject 
    { 
     if (parent != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(parent, i); 
       T candidate = child as T; 
       if (candidate != null) 
       { 
        return candidate; 
       } 

       T childOfChild = FindVisualChild<T>(child); 
       if (childOfChild != null) 
       { 
        return childOfChild; 
       } 
      } 
     } 

     return default(T); 
    } 

棘手的部分是從邏輯列表(由Items組成)到視覺列表(ListViewItem s包裝TextBox es)的映射。

+0

這裏是MSDN FORUM上的類似主題:https://social.msdn.microsoft.com/Forums/windowsapps/en-US/b928da3c-a514-4069-bf11-0cd65d21f28c/how-to-move-focus-between-listviews -textboxes?論壇= wpdevelop#c084c5af-5386-410e-8be1-c4842f25bcd4 – Pawel