在Controls.ListView中设置初始键盘焦点

时间:2018-09-15 13:49:34

标签: c# wpf listview

我有一个带有单个ListView的窗口:

Initial screen

看起来好像焦点在列表中的第一个元素上。当我按下 Down 时,我希望焦点移到第二行,但是它停留在此元素上。虚线框从整个列表移到第一个列表项:

After pressing Tab

这时,按 Down 可以将焦点按预期方式向下移动。

我已经对如何从一开始就获得键盘焦点进行了一些研究,但是我没有成功。在ListView的属性中,有AnchorItemFocusedInfo,它们看起来都很有前途,但是它们不能直接访问,因此我不知道设置它们的正确方法。

这是我当前的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 :(得分:1)

技巧似乎是将焦点显式设置为ListView中第一个项目的项目容器。我找到了一个很好的解释here

该博客文章的简短摘要:

因为在创建ListView焦点之后这些项无法直接使用,所以必须在后台生成所有项之后再进行聚焦。因此,请附加到StatusChanged的{​​{1}}事件:

ItemContainerGenerator

然后在事件处理程序中,在所有内容生成完毕后设置焦点:

Persons.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;

此解决方案并不像我希望的那样简单,但是对我有用。