none
MVVM - Popup - TextBox mit Enter Eingabe weiterspringen RRS feed

  • Frage

  • Hallo Zusammen,

    ich hoffe, ihr wart alle erfolgreich bei eurer Ostereiersuche ;)

    In folgender Anwendung habe ich ein Popup mit verschiedenen Eingabefeldern. Etwa wie folgt:

            <local:PopupNonTopmost Placement="Center" AllowsTransparency="True" IsOpen="{Binding IsPopupVisible}">
                <Border BorderBrush="Black" BorderThickness="2">
                    <StackPanel>
                        <TextBlock Text="Zusatzdaten eingeben" FontSize="35" FontWeight="ExtraBold" HorizontalAlignment="Center" Background="AntiqueWhite"/>
                        <StackPanel>
                            <DockPanel>
                                <TextBlock Text="Maschinennummer:" Width="190" FontSize="20" Background="AntiqueWhite" FontWeight="Bold"/>
                                <TextBox Text="{Binding Maschinennummer}" FontSize="20"/>
                            </DockPanel>
                            <DockPanel>
                                <TextBlock Text="Name:" Width="190" FontSize="20" Background="AntiqueWhite" FontWeight="Bold"/>
                                <TextBox Text="{Binding Mitarbeitername}" FontSize="20"/>
                            </DockPanel>
                            <DockPanel>  
                </Border>
            </local:PopupNonTopmost>
    

    Wie gelingt es mir, nachdem der Anwender die Maschinennummer eingegeben hat, mit der Taste "Enter"in die nächste Eingabezeile (<TextBox Text="Binding Mitarbeitername" ... >) zu springen?

    Vielen Dank schonmal für Eure Unterstützung.

    Viele Grüße
    Martin

    Mittwoch, 24. April 2019 07:26

Antworten

  • Um die Reihenfolge der TextBoxen festzulegen, kannst du ihnen zur Sicherheit einen TabIndex geben:

    <TextBox Text="{Binding Maschinennummer}" FontSize="20" TabIndex="0"/>
    <TextBox Text="{Binding Mitarbeitername}" FontSize="20" TabIndex="1"/>

    Im Code (z.B. gleich nach Initialize) registrierst du einen neuen EventHandler für TextBoxen:

    EventManager.RegisterClassHandler(typeof(TextBox), TextBox.KeyDownEvent, new KeyEventHandler(TextBox_KeyDown));

    und diesen dann implementieren:

            private void TextBox_KeyDown(Object sender, KeyEventArgs e)
            {
                var tb = (TextBox) sender;
    
                if (!((e.Key == Key.Enter) & (tb?.AcceptsReturn == false)))
                {
                    return;
                }
    
                // Aktuelles Element holen
                var elementWithFocus = (UIElement)Keyboard.FocusedElement;
    
                if (elementWithFocus == null)
                {
                    return;
                }
    
                // Auf nächstes Element setzen
                if (elementWithFocus.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)))
                {
                    // Event als bearbeitet markieren
                    e.Handled = true;
                }
            }
    

    Mittwoch, 24. April 2019 09:07
  • Hi Martin,
    Du kannst die System.Windows.Interactivity aus Nuget laden und damit alles ohne CodeBehind machen.

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 25. April 2019 11:30

Alle Antworten

  • Um die Reihenfolge der TextBoxen festzulegen, kannst du ihnen zur Sicherheit einen TabIndex geben:

    <TextBox Text="{Binding Maschinennummer}" FontSize="20" TabIndex="0"/>
    <TextBox Text="{Binding Mitarbeitername}" FontSize="20" TabIndex="1"/>

    Im Code (z.B. gleich nach Initialize) registrierst du einen neuen EventHandler für TextBoxen:

    EventManager.RegisterClassHandler(typeof(TextBox), TextBox.KeyDownEvent, new KeyEventHandler(TextBox_KeyDown));

    und diesen dann implementieren:

            private void TextBox_KeyDown(Object sender, KeyEventArgs e)
            {
                var tb = (TextBox) sender;
    
                if (!((e.Key == Key.Enter) & (tb?.AcceptsReturn == false)))
                {
                    return;
                }
    
                // Aktuelles Element holen
                var elementWithFocus = (UIElement)Keyboard.FocusedElement;
    
                if (elementWithFocus == null)
                {
                    return;
                }
    
                // Auf nächstes Element setzen
                if (elementWithFocus.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)))
                {
                    // Event als bearbeitet markieren
                    e.Handled = true;
                }
            }
    

    Mittwoch, 24. April 2019 09:07
  • Hallo Christoph,

    danke für deine Antwort. Es funktioniert soweit prima. Gibt es noch eine andere Lösung im WPF ohne Code behind zu arbeiten?

    Mit deiner Lösung setze ich hinter jeder Textbox die Methode

    TextBox_KeyDown

    was, wie schon gesagt, funktioniert.

    Danke und Gruß
    Martin

    Donnerstag, 25. April 2019 10:54
  • Hi Martin,
    Du kannst die System.Windows.Interactivity aus Nuget laden und damit alles ohne CodeBehind machen.

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 25. April 2019 11:30