Установить начальный фокус клавиатуры в Controls.ListView - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть окно с одним ListView:

Initial screen

Похоже, что фокус находится на первом элементе в списке. Когда я нажимаю Вниз , я ожидаю, что фокус переместится на вторую строку, но он останется на этом элементе. Тем не менее, пунктирная граница перемещается от всего списка к первому элементу списка:

After pressing Tab

В этот момент нажатие Вниз перемещает фокус вниз, как и ожидалось.

Я уже провел небольшое исследование о том, как правильно сфокусировать клавиатуру с самого начала, но мне это не удалось. В свойствах ListView есть AnchorItem и FocusedInfo, которые выглядят многообещающе, но они не доступны напрямую, поэтому я не знаю, как правильно их установить.

Вот мой текущий код XAML:

<Window x:Class="CSharp_Playground.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CSharp_Playground"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <Window.DataContext>
        <local:Model />
    </Window.DataContext>

    <ListView Name="Persons" ItemsSource="{Binding Persons}" SelectionMode="Single" />
</Window>

и соответствующий код C #:

using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace CSharp_Playground
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            Persons.SelectedIndex = 0;
            Persons.Focus();
        }
    }

    public class Model
    {
        public IEnumerable<string> Persons { get; } = new ObservableCollection<string>(new []{"1","2","3"});
    }
}

1 Ответ

0 голосов
/ 15 сентября 2018

Хитрость заключается в том, чтобы явно установить фокус на контейнер для элемента первого элемента в ListView. Я нашел хорошее объяснение здесь .

Краткое содержание этого сообщения в блоге:

Поскольку элементы не доступны непосредственно после создания ListView, фокусировка должна произойти после того, как все элементы сгенерированы в фоновом режиме. Итак, присоединитесь к событию StatusChanged из ItemContainerGenerator:

Persons.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;

А в обработчике событий установите фокус после завершения генерации:

private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
   if (Persons.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
   {
       int index = Persons.SelectedIndex;
       if (index >= 0)
           ((ListViewItem)Persons.ItemContainerGenerator.ContainerFromIndex(index)).Focus();
   }
}

Это решение не так просто, как я надеялся, но оно сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...