如何在ListBox中的第一个项目上捕获keyup事件?

时间:2011-01-13 23:45:57

标签: .net wpf event-handling listbox

我有一个ListBox,上面有一个TextBox。我想使用箭头键从ListBox导航到TextBox。

目的是如果选择了ListBox中的第一项,并且用户按键,则TextBox将获得焦点。

我几乎有这个工作,但问题是当用户键入时,在引发KeyUp事件之前,更改了SelectedItem。这意味着当用户在ListBox中选择了第二个项时,就会发生对TextBox的导航。

如何将keyup事件捕获到ListBox中的第一项?

<StackPanel>
 <TextBox Name="TextBox1"></TextBox>
 <ListBox Name="ListBox1" KeyUp="ListBox_KeyUp">
  <ListBoxItem>a</ListBoxItem>
  <ListBoxItem>b</ListBoxItem>
  <ListBoxItem>c</ListBoxItem>
 </ListBox>
</StackPanel>


    private void ListBox_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Up)
        {
            if (this.ListBox1.SelectedIndex == 0)
                this.TextBox1.Focus();
        }
    }

1 个答案:

答案 0 :(得分:3)

假设你真的想要这个,你可以使用PreviewKeyDown,如下所示:

    <StackPanel>
        <TextBox Name="textBox1"/>
        <ListBox PreviewKeyDown="ListBox_PreviewKeyDown">
            <ListBoxItem Content="Item1" />
            <ListBoxItem Content="Item2"/>
            <ListBoxItem Content="Item3"/>
        </ListBox>
    </StackPanel>

使用此代码隐藏:

    private void ListBox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (sender is ListBox)
        {
            var listBox = sender as ListBox;
            if (listBox.Items.Count > 0)
            {
                if (e.Key == Key.Up && listBox.Items.Count > 0 && listBox.SelectedIndex == 0)
                {
                    textBox1.Focus();
                    e.Handled = true;
                }
            }
        }
    }