以编程方式选择ListBox项目后,需要按下向上键两次来移动选择。有什么建议吗?
查看:
<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>
代码:
public View()
{
lbActions.Focus();
lbActions.SelectedIndex = 0; //not helps
((ListBoxItem) lbActions.SelectedItem).Focus(); //not helps either
}
答案 0 :(得分:13)
不要将焦点设置为ListBox ...将焦点设置为选定的ListBoxItem。这将解决“需要两个键盘敲击”的问题:
if (lbActions.SelectedItem != null)
((ListBoxItem)lbActions.SelectedItem).Focus();
else
lbActions.Focus();
如果您的ListBox包含的内容不是ListBoxItem
,则可以使用lbActions.ItemContainerGenerator.ContainerFromIndex(lbActions.SelectedIndex)
获取自动生成的ListBoxItem
。
如果您希望在窗口初始化期间发生这种情况,则需要将代码放在Loaded
事件中而不是构造函数中。示例(XAML):
<Window ... Loaded="Window_Loaded">
...
</Window>
代码(基于您问题中的示例):
private void Window_Loaded(object sender, RoutedEventArgs e)
{
lbActions.Focus();
lbActions.SelectedIndex = 0;
((ListBoxItem)lbActions.SelectedItem).Focus();
}
答案 1 :(得分:1)
您也可以在XAML中轻松完成此操作。请注意,这只会设置逻辑焦点。
例如:
<Grid FocusManager.FocusedElement="{Binding ElementName=itemlist, Path=SelectedItem}">
<ListBox x:Name="itemlist" SelectedIndex="1">
<ListBox.Items>
<ListBoxItem>One</ListBoxItem>
<ListBoxItem>Two</ListBoxItem>
<ListBoxItem>Three</ListBoxItem>
<ListBoxItem>Four</ListBoxItem>
<ListBoxItem>Five</ListBoxItem>
<ListBoxItem>Six</ListBoxItem>
</ListBox.Items>
</ListBox>
</Grid>
答案 2 :(得分:-1)
似乎对于ListBox控件有两个焦点级别:ListBox本身和ListBoxItem。就像Heinzi所说的那样,直接为ListBoxItem设置Focus可以避免这样的情况,即您必须在方向键上单击两次才能浏览所有ListBoxItem。
经过几个小时的工作,我发现了这一点,现在它可以在我的APP上完美运行。