Как я могу перехватить событие keyup для первого элемента в ListBox? - PullRequest
3 голосов
/ 14 января 2011

У меня есть ListBox с TextBox над ним.Я хотел бы использовать клавиши со стрелками для перехода от ListBox к TextBox.

Предполагается, что если выбран первый элемент в ListBox и пользователь нажимает клавишу вверх, TextBox получит фокус.

У меня почти все работает, но проблема в том, что когда пользователь нажимает клавишу вверх, SelectedItem изменяется до , когда возникает событие KeyUp.Это означает, что переход к TextBox происходит, когда пользователь выбрал элемент second в ListBox.

Как я могу перехватить событие 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 Ответ

3 голосов
/ 14 января 2011

Если вы действительно хотите этого, вы можете использовать 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;
                }
            }
        }
    }
...