WPF: une zone de texte qui a un événement qui se déclenche lorsque vous appuyez sur la touche Entrée

StackOverflow https://stackoverflow.com/questions/816334

  •  03-07-2019
  •  | 
  •  

Question

Au lieu de joindre un événement PreviewKeyUp à chaque TextBox de mon application et de vérifier si la touche enfoncée était une touche Entrée puis d'effectuer une action, j'ai décidé d'implémenter étendu version d'une TextBox qui inclut un événement DefaultAction qui se déclenche lorsqu'une touche Entrée est enfoncée dans une TextBox .

J'ai essentiellement créé une nouvelle classe qui s'étend de TextBox avec un événement public DefaultAction , comme suit:

public class DefaultTextBoxControl:TextBox
{
    public event EventHandler<EventArgs> DefaultAction = delegate { };

    public DefaultTextBoxControl()
    {
        PreviewKeyUp += DefaultTextBoxControl_PreviewKeyUp;
    }

    void DefaultTextBoxControl_PreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key != Key.Enter)
        {
            return;
        }
        DefaultAction(this, EventArgs.Empty);
    }
}

J'utilise ensuite cette zone de texte personnalisée à partir de mon application comme telle (xaml):

<Controls:DefaultTextBoxControl  DefaultAction="DefaultTextBoxControl_DefaultAction">
</Controls:DefaultTextBoxControl>

Maintenant, dans ma petite expérience d’apprentissage de WPF, j’ai réalisé que la plupart du temps, il existe un "refroidisseur". (et, espérons-le, plus facile) de mettre en œuvre les choses

... ma question est donc la suivante: Comment puis-je améliorer le contrôle ci-dessus? Ou peut-être y a-t-il une autre façon de faire le contrôle ci-dessus? ... peut-être en utilisant uniquement du code déclaratif au lieu des deux types déclaratif (xaml) et procédural (C #)?

Était-ce utile?

La solution

Consultez ce billet de blog à partir d'un Il y a quelques mois, j'ai attaché un gestionnaire d'événements 'global' à TextBox.GotFocus pour sélectionner le texte.

En gros, vous pouvez gérer l'événement KeyUp dans votre classe App, comme suit:

protected override void OnStartup(StartupEventArgs e)
{
    EventManager.RegisterClassHandler(typeof(TextBox),
        TextBox.KeyUpEvent,
        new System.Windows.Input.KeyEventHandler(TextBox_KeyUp));

    base.OnStartup(e);
}

private void TextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key != System.Windows.Input.Key.Enter) return;

    // your event handler here
    e.Handled = true;
    MessageBox.Show("Enter pressed");
}

... et maintenant chaque TextBox de votre application appellera la méthode TextBox_KeyUp à mesure que les utilisateurs y taperont.

Mettre à jour

Comme vous l'avez indiqué dans votre commentaire, cela n'est utile que si chaque TextBox doit exécuter le même code.

Pour ajouter un événement arbitraire tel qu'une pression sur la touche Entrée, il vaut peut-être mieux consulter Événements associés . Je crois que cela peut vous donner ce que vous voulez.

Autres conseils

Depuis que cette question a été posée, il existe maintenant une propriété InputBindings sur les zones de texte et les autres contrôles. Avec cela, une solution purement XAML peut être utilisée, plutôt que d'utiliser des contrôles personnalisés. L'affectation de KeyBinding pour Renvoi et Entrée pour pointer sur une commande peut le faire.

Exemple:

<TextBox Text="Test">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding SomeCommand}" Key="Return" />
        <KeyBinding Command="{Binding SomeCommand}" Key="Enter" />
    </TextBox.InputBindings>
</TextBox>

Certains ont mentionné que Entrée ne fonctionnait pas toujours et que Return pouvait être utilisé sur certains systèmes.

Lorsque l'utilisateur appuie sur la touche Entrée de la zone de texte, l'entrée dans la zone de texte apparaît dans une autre zone de l'interface utilisateur.

Le code XAML suivant crée l'interface utilisateur, qui consiste en un StackPanel, un TextBlock et un TextBox.

<StackPanel>
  <TextBlock Width="300" Height="20">
    Type some text into the TextBox and press the Enter key.
  </TextBlock>
  <TextBox Width="300" Height="30" Name="textBox1"
           KeyDown="OnKeyDownHandler"/>
  <TextBlock Width="300" Height="100" Name="textBlock1"/>
</StackPanel>

Le code suivant derrière crée le gestionnaire d'événements KeyDown. Si la touche sur laquelle vous appuyez est la touche Entrée, un message s'affiche dans le TextBlock.

private void OnKeyDownHandler(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Return)
    {
        textBlock1.Text = "You Entered: " + textBox1.Text;
    }
}

Pour plus d'informations, consultez MSDN Doc

    private void txtBarcode_KeyDown(object sender, KeyEventArgs e)
    {
        string etr = e.Key.ToString();

        if (etr == "Return")
        {
            MessageBox.Show("You Press Enter");
        }
    }

ajoutez un événement dans xaml à la zone de texte ou à l'objet spécifique:

KeyDown = " txtBarcode_KeyDown "

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top