none
wpf vs 2017 key down

    Question

  • bonjour dernière étape de mon développement

    voici mon soucis que je sais pas résoudre

     j'ai un texbox qui est ajouté  entant que children a un stack panet comment faire pour que lorsque je clique sur entrée il se réalise un keydown et me permette de poursuivre une autre action

    je vous donne mon code

    txtbpoids = new TextBox(); txtbpoids.FontSize = 16; txtbpoids.Height = 20; txtbpoids.Width = 35; txtbpoids.HorizontalAlignment = HorizontalAlignment.Left; txtbpoids.VerticalAlignment = VerticalAlignment.Top; txtbpoids.Margin = new Thickness(170, -20, 0, 0); stplignesglucides.Children.Add(txtbpoids); j'ai fait un facous sur ce texbox et je me suis arrêté là

    merci de votre aide si précieuse


    samedi 14 octobre 2017 14:45

Réponses

  • Bonjour SIMONGEORGES,

    Une solution est de créer un événement KeyDown pour votre TextBox et dans cet événement chercher le prochain contrôles comme suit :

    private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter & (sender as TextBox).AcceptsReturn == false)
            MoveToNextUIElement(e);
    }

    Ici nous vérifions bien que l'utilisateur a appuyé sur la touche Entrer du clavier tout en nous assurant de désactiver l'action du return sur entrée dans ce TextBox. MoveToNextUIElement est une méthode que vous devez ajouter dans votre fichier source :

    private void MoveToNextUIElement(KeyEventArgs e)
    {
        // L'object de type FocusNavigationDirection définit le sens de direction
        FocusNavigationDirection focusDirection = FocusNavigationDirection.Next;
    
        // pour appliquer la direction souhaitée, on utilise un object TraversalRequest
         TraversalRequest request = new TraversalRequest(focusDirection);
    
        // On obtient le contrôle actuel qui a le focus
        UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
    
        if (elementWithFocus != null)
        {
            // et ensuite on bouge dans la direction souhaité vers le prochain contrôle
            // et on lui donne le focus
            if (elementWithFocus.MoveFocus(request))
                e.Handled = true;
        }
    }

    Cordialement,

    • Marqué comme réponse SIMONGEORGES lundi 16 octobre 2017 21:13
    lundi 16 octobre 2017 14:45

Toutes les réponses

  • Bonjour SIMONGEORGES,

    Une solution est de créer un événement KeyDown pour votre TextBox et dans cet événement chercher le prochain contrôles comme suit :

    private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter & (sender as TextBox).AcceptsReturn == false)
            MoveToNextUIElement(e);
    }

    Ici nous vérifions bien que l'utilisateur a appuyé sur la touche Entrer du clavier tout en nous assurant de désactiver l'action du return sur entrée dans ce TextBox. MoveToNextUIElement est une méthode que vous devez ajouter dans votre fichier source :

    private void MoveToNextUIElement(KeyEventArgs e)
    {
        // L'object de type FocusNavigationDirection définit le sens de direction
        FocusNavigationDirection focusDirection = FocusNavigationDirection.Next;
    
        // pour appliquer la direction souhaitée, on utilise un object TraversalRequest
         TraversalRequest request = new TraversalRequest(focusDirection);
    
        // On obtient le contrôle actuel qui a le focus
        UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
    
        if (elementWithFocus != null)
        {
            // et ensuite on bouge dans la direction souhaité vers le prochain contrôle
            // et on lui donne le focus
            if (elementWithFocus.MoveFocus(request))
                e.Handled = true;
        }
    }

    Cordialement,

    • Marqué comme réponse SIMONGEORGES lundi 16 octobre 2017 21:13
    lundi 16 octobre 2017 14:45
  • un tres grand merci

    lundi 16 octobre 2017 21:13
  • merci de votre réponse je viens de la tester mais je comprends pas  le deuxième code concernant le mouvement pouvez vous m'expliquer

    lundi 16 octobre 2017 21:53
  • Tout ce qu'il y a dans votre fenêtre sont des UIElement (c'est ce qui caractérise un contrôle). Dans la méthode MoveToNextUIElement, nous obtenons l'élément actuel qui a le focus (donc par exemple cliquer dans la zone d'un TextBox lui donne le focus).

    UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;

    Plus d'info sur la méthode Keyboard.FocusedElement. Ensuite, pour programmatiquement bouger vers un autre élément, il faut définir le sens de navigation : cela se fait grâce à l'énumération FocusNavigationDirection, dans cet exemple je le définie à Next pour dire que je souhaite que le sens de navigation aille au prochain contrôle dans l'arborescence UI.

    Et donc pour appliquer le sens de navigation, on appelle la méthode de notre UI Element MoveFocus qui attend en paramètre un objet de type TraversalRequest correspondant au sens de notre navigation.

    Cordialement,

    mardi 17 octobre 2017 07:30
  • Une très grand merci les idées sont plus claires mais je n'arrive pas toujours a realiser une action sur le deuxième textbox pouvez vous m'aider à bien comprendre voici la copie d’écran de mon exécution et le code ensuite

    le premier texbox  name 'txtbpoids1"  le txtbox de droite  name "txtbglucides"

    voici mon code  et je voudrais que lorsue je fait  "entrée"  le deuxième textbox recopie le contenu du premier texbox

    namespace WpfApp2_test_key_retrun
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private TextBox txtbpoids1;
            private readonly KeyEventHandler txtbpoids1_KeyDown;
    
            public MainWindow()
            {
                InitializeComponent();
    
                txbkcrudite.Visibility = Visibility.Hidden;
                txtbpoids.Visibility = Visibility.Hidden;
                txbkgr.Visibility = Visibility.Hidden;
                txtbglucides.Visibility = Visibility.Hidden;
                txbkgl.Visibility = Visibility.Hidden;
    
            }
    
            private void btncalcul_Click(object sender, RoutedEventArgs Key)
            {
                string valeur = txtbxplatselect.Text;
                if (valeur == "Crudités")
                {
                    MessageBox.Show(valeur.ToString());
    
                    txbkcrudite = new TextBlock();
                    txbkcrudite.FontSize = 16;
                    txbkcrudite.HorizontalAlignment = HorizontalAlignment.Left;
                    txbkcrudite.VerticalAlignment = VerticalAlignment.Top;
                    txbkcrudite.Text = valeur.ToString();
                    txbkcrudite.Margin = new Thickness(6, 0, 0, 0);
                    stplignesglucides.Children.Add(txbkcrudite);
    
                    txtbpoids1 = new TextBox();
                    txtbpoids1.FontSize = 16;
                    txtbpoids1.Height = 20;
                    txtbpoids1.Width = 35;
                    txtbpoids1.HorizontalAlignment = HorizontalAlignment.Left;
                    txtbpoids1.VerticalAlignment = VerticalAlignment.Top;
                    txtbpoids1.Margin = new Thickness(170, -20, 0, 0);
                    stplignesglucides.Children.Add(txtbpoids1);
    
                    txtbglucides = new TextBox();
                    txtbglucides.FontSize = 16;
                    txtbglucides.Height = 20;
                    txtbglucides.Width = 35;
                    txtbglucides.HorizontalAlignment = HorizontalAlignment.Left;
                    txtbglucides.VerticalAlignment = VerticalAlignment.Top;
                    txtbglucides.Margin = new Thickness(230, -20, 0, 0);
                    stplignesglucides.Children.Add(txtbglucides);
    
                    txtbpoids1.Focus();
                }
    
            }
            private void Txtbpoids1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Enter & (sender as TextBox).AcceptsReturn == false)
                {
                    MoveToNextUIElement(e);
    
                }
            }
    
    
            private void MoveToNextUIElement(KeyEventArgs e)
            {
                // L'object de type FocusNavigationDirection définit le sens de direction
                FocusNavigationDirection focusDirection = FocusNavigationDirection.Next;
    
                // pour appliquer la direction souhaitée, on utilise un object TraversalRequest
                TraversalRequest request = new TraversalRequest(focusDirection);
    
                // On obtient le contrôle actuel qui a le focus
                UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
    
                if (elementWithFocus != null)
                {
                    // et ensuite on bouge dans la direction souhaité vers le prochain contrôle
                    // et on lui donne le focus
                    if (elementWithFocus.MoveFocus(request))
                        e.Handled = true;
                    txtbglucides.Focus();
                    //txtbglucides.Text = txtbpoids1.ToString();
    
                }
            }
        }
    }
    
    

    merci encore de votre patience


    mardi 17 octobre 2017 12:51
  • J'ai du mal comprendre votre problème alors, du coup oubliez tout ce que je vous ai dit, il suffit de faire ceci :

    txtbpoids = new TextBox(); txtbpoids.FontSize = 16; txtbpoids.Height = 20; txtbpoids.Width = 35; txtbpoids.HorizontalAlignment = HorizontalAlignment.Left; txtbpoids.VerticalAlignment = VerticalAlignment.Top; txtbpoids.Margin = new Thickness(170, -20, 0, 0); stplignesglucides.Children.Add(txtbpoids); txtbpoids.AcceptsReturn = false; txtbpoids.KeyDown += Txtbpoids_KeyDown;

    txtbglucides = new TextBox();
    txtbglucides
    .FontSize = 16;
    txtbglucides
    .Height = 20;
    txtbglucides
    .Width = 35;
    txtbglucides
    .HorizontalAlignment = HorizontalAlignment.Left;
    txtbglucides
    .VerticalAlignment = VerticalAlignment.Top;
    txtbglucides
    .Margin = new Thickness(230, -20, 0, 0);
    stplignesglucides
    .Children.Add(txtbglucides);
    [...] private void Txtbpoids_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { txtbother.Text = txtbpoids.Text; } }


    Si le but était simplement de copier le contenu d'un TextBox à un autre, j'avais compris que vous essayez de faire changer le focus sur la fenêtre.

    mardi 17 octobre 2017 13:06
  • je viensde tester le code cela ne fonctionne pas quand j'appuie sur entree rien ne se passe sur l'autre textbox

    voici mon code

            private void Txtbpoids1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Enter)
                {
                    txtbglucides.Text = txtbpoids.Text;
                }
            }


    • Modifié SIMONGEORGES mercredi 18 octobre 2017 09:49 lire txtbpoids 1.text
    mercredi 18 octobre 2017 09:36
  • Chez vous la TextBox correspondante est txtbpoids1 est non txtbpoids, donc modifiez la ligne ainsi :

    txtbglucides.Text = txtbpoids1.Text;

    dans le if

    mercredi 18 octobre 2017 13:13
  • bonjour je uis désole je viens de le corriger mais cela fonctionne pas quand j’appuie sur entree rien ne se passe sur l'autre textbox je vous redonne mon code complet excusez moi  mais votre aide est  importante

            private void btncalcul_Click(object sender, RoutedEventArgs Key)
            {
                string valeur = txtbxplatselect.Text;
                if (valeur == "Crudités")
                {
                    MessageBox.Show(valeur.ToString());
    
                    txbkcrudite = new TextBlock();
                    txbkcrudite.FontSize = 16;
                    txbkcrudite.HorizontalAlignment = HorizontalAlignment.Left;
                    txbkcrudite.VerticalAlignment = VerticalAlignment.Top;
                    txbkcrudite.Text = valeur.ToString();
                    txbkcrudite.Margin = new Thickness(6, 0, 0, 0);
                    stplignesglucides.Children.Add(txbkcrudite);
    
                    txtbpoids1 = new TextBox();
                    txtbpoids1.FontSize = 16;
                    txtbpoids1.Height = 20;
                    txtbpoids1.Width = 35;
                    txtbpoids1.HorizontalAlignment = HorizontalAlignment.Left;
                    txtbpoids1.VerticalAlignment = VerticalAlignment.Top;
                    txtbpoids1.Margin = new Thickness(170, -20, 0, 0);
                    stplignesglucides.Children.Add(txtbpoids1);
    
                    txtbglucides = new TextBox();
                    txtbglucides.FontSize = 16;
                    txtbglucides.Height = 20;
                    txtbglucides.Width = 35;
                    txtbglucides.HorizontalAlignment = HorizontalAlignment.Left;
                    txtbglucides.VerticalAlignment = VerticalAlignment.Top;
                    txtbglucides.Margin = new Thickness(230, -20, 0, 0);
                    stplignesglucides.Children.Add(txtbglucides);
    
                    txtbpoids1.Focus();
                }
    
    
            }
            private void Txtbpoids1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Enter)
                {
                    txtbglucides.Text = txtbpoids1.Text;
                }
            }
        }
    

    mercredi 18 octobre 2017 13:50
  • Vous n'avez pas abonné votre txtbpoids1 à l'événement KeyDown, juste en dessous de :

    txtbpoids1 = new TextBox();
    txtbpoids1.FontSize = 16;
    txtbpoids1.Height = 20;
    txtbpoids1.Width = 35;
    txtbpoids1.HorizontalAlignment = HorizontalAlignment.Left;
    txtbpoids1.VerticalAlignment = VerticalAlignment.Top;
    txtbpoids1.Margin = new Thickness(170, -20, 0, 0);
    stplignesglucides.Children.Add(txtbpoids1);
    

    Rajoutez :

    txtbpoids1.KeyDown += Txtbpoids1_KeyDown;

    et supprimez moi la ligne :

    private readonly KeyEventHandler txtbpoids1_KeyDown;

    en haut de vos définition dans votre fichier.

    mercredi 18 octobre 2017 14:34
  • bonjour je viens de tester le code mais  cela en fonctionne toujours pas je vous redonne mon nouveau code pouvez vous m'expliquer le pourquoi$ encore merci et suis desolé de vous  accaparer mais je voudrias comprendre et le realiser

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApp2_test_key_retrun
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private TextBox txtbpoids1;
    
            public MainWindow()
            {
                InitializeComponent();
    
                txbkcrudite.Visibility = Visibility.Hidden;
                txtbpoids.Visibility = Visibility.Hidden;
                txbkgr.Visibility = Visibility.Hidden;
                txtbglucides.Visibility = Visibility.Hidden;
                txbkgl.Visibility = Visibility.Hidden;
    
            }
    
            public object e { get; private set; }
            public KeyEventHandler txtbpoids1_KeyDown { get; private set; }
    
            private void btncalcul_Click(object sender, RoutedEventArgs Key)
            {
                string valeur = txtbxplatselect.Text;
                if (valeur == "Crudités")
                {
                    MessageBox.Show(valeur.ToString());
    
                    txbkcrudite = new TextBlock();
                    txbkcrudite.FontSize = 16;
                    txbkcrudite.HorizontalAlignment = HorizontalAlignment.Left;
                    txbkcrudite.VerticalAlignment = VerticalAlignment.Top;
                    txbkcrudite.Text = valeur.ToString();
                    txbkcrudite.Margin = new Thickness(6, 0, 0, 0);
                    stplignesglucides.Children.Add(txbkcrudite);
    
                    txtbpoids1 = new TextBox();
                    txtbpoids1.FontSize = 16;
                    txtbpoids1.Height = 20;
                    txtbpoids1.Width = 35;
                    txtbpoids1.HorizontalAlignment = HorizontalAlignment.Left;
                    txtbpoids1.VerticalAlignment = VerticalAlignment.Top;
                    txtbpoids1.Margin = new Thickness(170, -20, 0, 0);
                    stplignesglucides.Children.Add(txtbpoids1);
    
    
                    txtbglucides = new TextBox();
                    txtbglucides.FontSize = 16;
                    txtbglucides.Height = 20;
                    txtbglucides.Width = 35;
                    txtbglucides.HorizontalAlignment = HorizontalAlignment.Left;
                    txtbglucides.VerticalAlignment = VerticalAlignment.Top;
                    txtbglucides.Margin = new Thickness(230, -20, 0, 0);
                    stplignesglucides.Children.Add(txtbglucides);
    
                    //txtbpoids1.Focus();
                    //txtbpoids1.KeyDown += txtbpoids1_KeyDown;
                    
                }
    
            }
            private void Txtbpoids1_KeyDown(object sender, KeyEventArgs e)
    
            {
                txtbpoids1.KeyDown += txtbpoids1_KeyDown;
    
                if (e.Key == Key.Return)
                {
                    txtbglucides.Text = txtbpoids1.Text;
                }
            }
        }
    }
    
    

    encore merci

    jeudi 19 octobre 2017 09:05