RichTextBox équivalent de TextBox.AcceptsReturn

je suis en train de changer plusieurs boîtes de texte pour des boîtes RichText pour gagner quelques-unes des fonctionnalités fraîches.

j'ai configuré mes boîtes de textes pour Qu'elles acceptent le retour, de sorte que la touche Entrée crée une nouvelle ligne, plutôt que de quitter le contrôle. La RichTextBox ne semble pas posséder cette fonctionnalité.

y a-t-il une façon simple de faire cela, ou dois-je capturer tous les porte-clés et les manipuler individuellement?

10
demandé sur captncraig 2010-07-16 23:51:19

4 réponses

Note: Ce problème ne se produit que lorsque vous définissez la propriété "AcceptButton" du formulaire.

Réglez la RichTextBox.AcceptsTab à true. Pour une raison quelconque cela fonctionne à la fois pour les onglets et la touche enter. Si vous voulez seulement les clés enter alors vous devrez écrire le code personnalisé.

17
répondu Carter Medlin 2010-07-16 20:32:56

la solution est d'outrepasser IsInputKey:

protected override bool IsInputKey(Keys keyData)
{
    if (
        (keyData & ~Keys.Modifiers) == Keys.Tab &&
        (keyData & (Keys.Control | Keys.Alt)) == 0
    )
        return false;

    return base.IsInputKey(keyData);
}

Après le réglage de AcceptsTab true, vous vous assurez que l' RichTextBox traite à la fois la touche tab et la touche return. Avec l' IsInputKey implémentation ci-dessus, nous nous assurons que la touche Tab et Shift+Tab n'atteigne jamais le RichTextBox ils sont donc utilisés pour la navigation à la place.

la clause de dérogation ci-dessus doit être collée dans une classe dérivée de RichTextBox.

1
répondu Pieter van Ginkel 2011-07-09 15:49:13

puisque Carter a souligné que cela ne s'applique que si AcceptButton est mis, et que l'autre solution suggère de dériver la classe RichTextBox, j'ai trouvé une autre solution simple. Il suffit de désactiver AcceptButton pour le temps que le/A RichTextBox a le focus. Voici un exemple de code:

private void RichText_Enter(object sender, EventArgs e)
{
    AcceptButton = null;
}

private void RichText_Leave(object sender, EventArgs e)
{
    AcceptButton = OKActionButton;
}

ceci suppose que vous n'avez qu'un seul AcceptButton et que cela ne changera probablement pas. Dans le cas contraire, vous devrez copier une logique de recherche D'AcceptButton ici ou simplement sauvegarder L'AcceptButton précédent. valeur avant de la définir à null.

cette solution a aussi pour effet secondaire de supprimer la bordure par défaut du bouton d'acceptation actuel, indiquant à l'utilisateur qu'en appuyant sur la touche Entrée maintenant, ce bouton ne sera pas activé.

1
répondu ygoe 2012-01-20 18:01:22

il suffit de modifier L'option Accept dans la propriété Richtextbox tourner vers "true" cela fonctionnera comme une magie

0
répondu sheikh 2014-08-02 22:18:09