247 votes

Comment sélectionner automatiquement tout le texte sur le focus dans la zone de texte WPF ?

Si je l'appelle, SelectAll d'un GotFocus gestionnaire d'événements, il ne fonctionne pas avec la souris - la sélection disparaît dès que la souris est relâché.

EDIT: les Gens sont goût Donnelle réponse, je vais essayer d'expliquer pourquoi je n'ai pas aimé autant que l'on a accepté la réponse.

  • Il est plus complexe, alors que l'on a accepté la réponse est la même chose de façon plus simple.
  • La facilité d'utilisation de accepté de répondre, c'est mieux. Lorsque vous cliquez sur dans le milieu du texte, le texte est désactivée lorsque vous relâchez la souris, vous permettant de commencer à modifier instantanément, et si vous voulez encore pour tout sélectionner, appuyez simplement sur le bouton de nouveau et cette fois il ne sera pas désélectionner lors de la libération. Suivant Donelle de la recette, si je clique dans le milieu du texte, je dois cliquer deuxième fois pour être en mesure de modifier. Si je clique quelque part dans le texte par rapport à l'extérieur du texte, le plus probablement, les moyens, je veux commencer à éditer au lieu de l'écraser de tout.

EDIT: Ce blog a un peu de théorie sur ce qui se passe. Pourquoi est-focus dans WPF si délicate?

218voto

Donnelle Points 3285

Nous l’avons donc le premier clic sélectionne tous, et un autre clic va à curseur (notre application est conçue pour une utilisation sur des tablettes avec des stylos).

Vous pourriez trouver utile.

171voto

Groky Points 6866

Réponse de Donnelle fonctionne le mieux, mais avoir à dériver une nouvelle classe pour l’utiliser est une douleur.

Au lieu de faire que j’ai enregistrer les gestionnaires les gestionnaires dans App.xaml.cs pour toutes les zones de texte dans l’application. Cela me permet d’utiliser réponse d’un Donelle avec le contrôle TextBox standard.

Ajoutez les méthodes suivantes à votre App.xaml.cs :

96voto

Nils Points 1824

C'est un peu vieux, mais je vais exposer ma réponse de toute façon.
J'ai choisi la partie de Donelles réponse (sauter ed double-cliquez sur) car je pense que cela crée le moins de l'étonnement chez les utilisateurs. Cependant, comme gcores je n'aime pas la nécessité de créer une dérive de la classe. Mais je n'aime pas gcores "au Démarrage..." la méthode. Et j'ai besoin de ce sur un "généralement, mais pas toujours".

J'ai mis en œuvre ce qu'un joint de Propriété de dépendance afin que je puisse régler SelectTextOnFocus.Active=True en xaml. Je trouve cette façon la plus agréable.

namespace foo.styles.behaviour
{
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Media;

    public class SelectTextOnFocus : DependencyObject
    {
        public static readonly DependencyProperty ActiveProperty = DependencyProperty.RegisterAttached(
            "Active",
            typeof(bool),
            typeof(SelectTextOnFocus),
            new PropertyMetadata(false, ActivePropertyChanged));

        private static void ActivePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is TextBox)
            {
                TextBox textBox = d as TextBox;
                if ((e.NewValue as bool?).GetValueOrDefault(false))
                {
                    textBox.GotKeyboardFocus += OnKeyboardFocusSelectText;
                    textBox.PreviewMouseLeftButtonDown += OnMouseLeftButtonDown;
                }
                else
                {
                    textBox.GotKeyboardFocus -= OnKeyboardFocusSelectText;
                    textBox.PreviewMouseLeftButtonDown -= OnMouseLeftButtonDown;
                }
            }
        }

        private static void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DependencyObject dependencyObject = GetParentFromVisualTree(e.OriginalSource);

            if (dependencyObject == null)
            {
                return;
            }

            var textBox = (TextBox)dependencyObject;
            if (!textBox.IsKeyboardFocusWithin)
            {
                textBox.Focus();
                e.Handled = true;
            }
        }

        private static DependencyObject GetParentFromVisualTree(object source)
        {
            DependencyObject parent = source as UIElement;
            while (parent != null && !(parent is TextBox))
            {
                parent = VisualTreeHelper.GetParent(parent);
            }

            return parent;
        }

        private static void OnKeyboardFocusSelectText(object sender, KeyboardFocusChangedEventArgs e)
        {
            TextBox textBox = e.OriginalSource as TextBox;
            if (textBox != null)
            {
                textBox.SelectAll();
            }
        }

        [AttachedPropertyBrowsableForChildrenAttribute(IncludeDescendants = false)]
        [AttachedPropertyBrowsableForType(typeof(TextBox))]
        public static bool GetActive(DependencyObject @object)
        {
            return (bool) @object.GetValue(ActiveProperty);
        }

        public static void SetActive(DependencyObject @object, bool value)
        {
            @object.SetValue(ActiveProperty, value);
        }
    }
}

Pour mon "général, mais pas toujours"-je définissez cette Propriété sur True dans un (global) zone de texte de Style. De cette façon, "en sélectionnant le Texte" est toujours "on", mais je suis capable de le désactiver sur une zone de texte de base.

82voto

gcores Points 6618

Ne sais pas pourquoi il perd la sélection dans l’événement GotFocus.

Mais une seule solution est de faire la sélection sur le GotKeyboardFocus et les événements GotMouseCapture. De cette façon, que cela fonctionnera toujours.

47voto

Sergey Aldoukhov Points 8386

Voici les comportements de mélange mise en œuvre de la solution de réponse pour votre confort :

Un pour attacher à une seule zone de texte :

Et un pour attacher à la racine d’un conteneur contenant plusieurs TextBox'es :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X