将焦点设置在ListBox项上会破坏键盘导航

Str*_*amT 9 wpf select listview listbox listboxitem

以编程方式选择ListBox项后,需要按下\ up键两次以移动选择.有什么建议?

视图:

<ListBox Name="lbActions" Canvas.Left="10" Canvas.Top="10"
               Width="260" Height="180">
        <ListBoxItem Name="Open" IsSelected="true" Content="Open"></ListBoxItem>
        <ListBoxItem Name="Enter" Content="Enter"></ListBoxItem>
        <ListBoxItem Name="Print" Content="Print"></ListBoxItem>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

码:

public View()
{
   lbActions.Focus();
   lbActions.SelectedIndex = 0; //not helps
   ((ListBoxItem) lbActions.SelectedItem).Focus(); //not helps either
}
Run Code Online (Sandbox Code Playgroud)

Hei*_*nzi 13

不要将焦点设置为ListBox ...将焦点设置为选定的ListBoxItem.这将解决"需要两个键盘笔划"的问题:

if (lbActions.SelectedItem != null)
    ((ListBoxItem)lbActions.SelectedItem).Focus();
else
    lbActions.Focus();
Run Code Online (Sandbox Code Playgroud)

如果ListBox包含除ListBoxItems 之外的其他内容,则可以使用它lbActions.ItemContainerGenerator.ContainerFromIndex(lbActions.SelectedIndex)来获取自动生成的内容ListBoxItem.


如果您希望在窗口初始化期间发生这种情况,则需要将代码放在Loaded事件中而不是放入构造函数中.示例(XAML):

<Window ... Loaded="Window_Loaded">
    ...
</Window>
Run Code Online (Sandbox Code Playgroud)

代码(基于您问题中的示例):

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        lbActions.Focus();
        lbActions.SelectedIndex = 0;
        ((ListBoxItem)lbActions.SelectedItem).Focus();
    }
Run Code Online (Sandbox Code Playgroud)