【问题标题】:UWP focus controlUWP 焦点控制
【发布时间】:2016-01-25 15:38:26
【问题描述】:

我在通用 Windows 10 应用程序中有带有 TextBoxes 的 ListView。我想编写代码:用户在 Listiew 中编辑任何 TextBox 并单击 Enter 键,我想将焦点移到 ListView 中的下一个 TextBox(我想采取与用户单击 Tab 键相同的操作)。

我的问题是:如何以编程方式将焦点移动到下一个 listView 元素

【问题讨论】:

  • 当我们按下 Tab 键时,ListViewItem 中的焦点会发生变化,不会移动到下一个 ListViewItem,所以我不确定你想做什么。你想让 Enter 键像 Tab 键一样吗?或者当我们按下 Enter 键时,焦点会移动到下一个 ListViewItem 中的 TextBox?
  • 您希望 Enter 键的作用类似于 Tab 键吗?或者当我们按下回车键时,焦点移动到下一个 ListViewItem 中的 TextBox? - 一个摊位。例如:ListViewItem 包含五个TextBox,从开始焦点是在第一个ListViewItem 上,在第一个它的TextBox 上。如果我按 EnterKey 焦点停留在当前 ListViewItem 但移动到下一个它的 TextBox。如果 foxus 在最后一个 TextBox 上,按下 EnterKey 后,foxus 将移动到下一个 ListViewItem 及其第一个 TextBox。

标签: c# uwp windows-10-universal


【解决方案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 组成)到可视列表(ListViewItems 包装TextBoxes)的映射。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-10-22
  • 2016-08-05
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多