我有一个带有单个ListView的窗口:
看起来好像焦点在列表中的第一个元素上。当我按下 Down 时,我希望焦点移到第二行,但是它停留在此元素上。虚线框从整个列表移到第一个列表项:
这时,按 Down 可以将焦点按预期方式向下移动。
我已经对如何从一开始就获得键盘焦点进行了一些研究,但是我没有成功。在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"});
}
}
答案 0 :(得分:1)
技巧似乎是将焦点显式设置为ListView中第一个项目的项目容器。我找到了一个很好的解释here。
该博客文章的简短摘要:
因为在创建ListView焦点之后这些项无法直接使用,所以必须在后台生成所有项之后再进行聚焦。因此,请附加到StatusChanged
的{{1}}事件:
ItemContainerGenerator
然后在事件处理程序中,在所有内容生成完毕后设置焦点:
Persons.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
此解决方案并不像我希望的那样简单,但是对我有用。