2011-01-13 2 views
3

Ich habe eine ListBox mit einem TextBox darüber. Ich möchte mit den Pfeiltasten von der ListBox zur TextBox navigieren.Wie kann ich das keyup-Ereignis auf dem ersten Element in einer ListBox abfangen?

Wenn das erste Element in der ListBox ausgewählt ist und der Benutzer die Tastenkombination eingibt, wird die TextBox den Fokus erhalten.

Ich habe fast das funktioniert, aber das Problem ist, dass, wenn der Benutzer die Tasten, das SelectedItem geändert wird vor das KeyUp-Ereignis ausgelöst wird. Dies bedeutet, dass die Navigation zur TextBox erfolgt, wenn der Benutzer das Element Sekunde in der ListBox ausgewählt hat.

Wie kann ich das Keyup-Ereignis auf das erste Element in einer ListBox abfangen?

<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(); 
     } 
    } 
+0

Haben Du dachtest auf KeyD zu hören stattdessen besitzen? – Lazarus

+0

@Lazarus: KeyDown ist nicht ausgelöst :) –

+0

@Greg Sansom: Das ist dann seltsam, vielleicht sehen Sie nicht KeyDown an der ListBox, aber es kann auf der ListBoxItem-Ebene sein? Auch PreviewKeyDown oder PreviewKeyUp bieten interessante Möglichkeiten. – Lazarus

Antwort

3

Angenommen, Sie wirklich dazu wollen, können Sie PreviewKeyDown wie folgt verwenden:

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

mit diesem Code-behind:

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; 
       } 
      } 
     } 
    } 
+0

Haben Sie versucht, das Programm auszuführen? Dies würde Ihnen zeigen, dass es dieses Problem nicht hat. Mit der Vorschau bearbeiten wir das Ereignis ** vor der ListBox. –

Verwandte Themen