我有通用Windows 10應用程序中的文本框ListView。我想編寫代碼:其中用戶正在編輯Listiew中的任何文本框,然後單擊輸入鍵,我想將焦點移動到ListView中的下一個TextBox(我想採取與用戶單擊Tab鍵時發生的操作相同的操作)。UWP焦點控制
我的問題是:如何以編程方式將焦點移動到下一個ListView控件元素
我有通用Windows 10應用程序中的文本框ListView。我想編寫代碼:其中用戶正在編輯Listiew中的任何文本框,然後單擊輸入鍵,我想將焦點移動到ListView中的下一個TextBox(我想採取與用戶單擊Tab鍵時發生的操作相同的操作)。UWP焦點控制
我的問題是:如何以編程方式將焦點移動到下一個ListView控件元素
假設我們有這樣一個模型對象,因此:
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)的映射。
這裏是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
當我們按Tab鍵時,焦點在ListViewItem中改變,並且不會移動到下一個ListViewItem,所以我不確定你想要做什麼。你想讓Enter鍵像Tab鍵一樣嗎?或者當我們按下Enter鍵時,焦點移動到下一個ListViewItem中的文本框? –
您是否希望Enter鍵起作用像Tab鍵?或者當我們按下Enter鍵時,焦點移動到下一個ListViewItem中的文本框? - 一個展位。例如:ListViewItem包含五個文本框,從開始的焦點位於第一個ListViewItem的第一個TextBox上。如果我按下EnterKey,焦點停留在當前的ListViewItem中,但移動到下一個TextBox。如果foxus在最後一個TextBox上,按下EnterKey後,foxus被移動到下一個ListViewItem及其第一個TextBox。 – Pawel