Si j'appelle à SelectAll
partir d'un GotFocus
gestionnaire d'événements, cela ne fonctionne pas avec la souris - la sélection disparaît dès que la souris est relâchée.
EDIT: Les gens aiment la réponse de Donnelle, je vais essayer d'expliquer pourquoi je ne l'aimais pas autant que la réponse acceptée.
- C'est plus complexe, alors que la réponse acceptée fait la même chose de manière plus simple.
- La convivialité de la réponse acceptée est meilleure. Lorsque vous cliquez au milieu du texte, le texte n'est pas sélectionné lorsque vous relâchez la souris, ce qui vous permet de commencer à modifier instantanément, et si vous souhaitez toujours tout sélectionner, appuyez à nouveau sur le bouton et cette fois, il ne sera pas désélectionné à la libération. Suivant la recette de Donelle, si je clique au milieu du texte, je dois cliquer une deuxième fois pour pouvoir éditer. Si je clique quelque part dans le texte par rapport à l'extérieur du texte, cela signifie très probablement que je veux commencer à éditer au lieu de tout écraser.
.net
wpf
silverlight
textbox
Sergey Aldoukhov
la source
la source
Réponses:
Je ne sais pas pourquoi il perd la sélection dans l'
GotFocus
événement.Mais une solution est de faire la sélection sur le
GotKeyboardFocus
et lesGotMouseCapture
événements. De cette façon, cela fonctionnera toujours.la source
Nous l'avons donc le premier clic sélectionne tout, et un autre clic va au curseur (notre application est conçue pour être utilisée sur des tablettes avec des stylos).
Vous pourriez trouver cela utile.
la source
SelectAllText
méthode de l'textBox.IsFocused
améliorer. Vous ne voulez pas tout sélectionner lorsque leGetKeyboardFocus
est dû à une alt-tabulation dans le programme.La réponse de Donnelle fonctionne le mieux, mais devoir dériver une nouvelle classe pour l'utiliser est une douleur.
Au lieu de cela, j'enregistre les gestionnaires les gestionnaires dans App.xaml.cs pour tous les TextBox de l'application. Cela me permet d'utiliser la réponse d'un Donnelle avec un contrôle TextBox standard.
Ajoutez les méthodes suivantes à votre App.xaml.cs:
la source
C'est assez ancien, mais je vais quand même afficher ma réponse.
J'ai choisi une partie de la réponse Donnelle (sauté le double-clic) car je pense que c'est plus naturel. Cependant, comme gcores, je n'aime pas la nécessité de créer une classe dérivée. Mais je n'aime pas non plus la
OnStartup
méthode gcores . Et j'en ai besoin sur une base "générale mais pas toujours".Je l'ai implémenté en tant que pièce jointe
DependencyProperty
afin de pouvoir définirlocal:SelectTextOnFocus.Active = "True"
pièce en xaml. Je trouve cette façon la plus agréable.Pour ma fonctionnalité "générale mais pas toujours", j'ai défini cette propriété Attache
True
dans un (global)TextBox
Style
. De cette façon, "sélectionner le texte" est toujours "activé", mais je peux le désactiver au cas par cas.la source
Voici les comportements de mélange implémentant la solution de réponse pour votre commodité:
Un pour attacher à un seul TextBox:
Et un pour attacher à la racine d'un conteneur contenant plusieurs TextBox'es:
la source
Bien que ce soit une vieille question, je viens d'avoir ce problème mais je l'ai résolu en utilisant un comportement attaché, plutôt qu'un comportement d'expression comme dans la réponse de Sergey. Cela signifie que je n'ai pas besoin d'une dépendance
System.Windows.Interactivity
dans le SDK Blend:Vous pouvez ensuite l'utiliser dans votre XAML comme ceci:
J'ai blogué à ce sujet ici .
la source
Voici une très bonne solution très simple sur MSDN :
Voici le code derrière:
la source
Je pense que cela fonctionne bien:
Si vous souhaitez l'implémenter comme méthode d'extension:
Et dans votre
GotFocus
événement:J'ai découvert la solution ci-dessus car il y a plusieurs mois, je cherchais un moyen de fixer le focus sur une donnée
UIElement
. J'ai découvert le code ci-dessous quelque part (un crédit est accordé) et cela fonctionne bien. Je le poste même s'il n'est pas directement lié à la question du PO car il montre le même schéma d'utilisationDispatcher
pour travailler avec aUIElement
.la source
Voici une tentative de résoudre certains des problèmes avec d'autres solutions:
Le code que j'ai écrit est configurable. Vous pouvez choisir sur quelles actions le sélectionner tous les comportements devraient se produire en définissant trois champs: lecture seule
SelectOnKeybourdFocus
,SelectOnMouseLeftClick
,SelectOnMouseRightClick
.L'inconvénient de cette solution est qu'elle est plus complexe et que l'état statique est stocké. Cela semble être une lutte affreuse avec le comportement par défaut du
TextBox
contrôle. Pourtant, cela fonctionne et tout le code est caché dans la classe de conteneur Propriété attachée.Pour attacher la propriété attachée à un
TextBox
, tout ce que vous avez à faire est d'ajouter l'espace de noms xml (xmlns
) de la propriété attachée et de l'utiliser comme ceci:Quelques notes sur cette solution:
TextBox
souvient de sa sélection après avoir perdu le focus. J'ai en fait outrepassé ce comportement.TextBox
(FirstActionIsMouseDown
champ statique).ContextMenu
champ statique).Le seul effet secondaire que j'ai trouvé, c'est quand
SelectOnMouseRightClick
c'est vrai. Parfois, le menu contextuel du clic droit scintille lorsqu'il est ouvert et un clic droit sur un espace videTextBox
ne fait pas "tout sélectionner".la source
Je n'ai trouvé aucune des réponses présentées ici imitant une zone de texte Windows standard. Par exemple, essayez de cliquer dans l'espace blanc entre le dernier caractère de la zone de texte et le côté droit de la zone de texte. La plupart des solutions ici sélectionneront toujours l'intégralité du contenu, ce qui rend très difficile l'ajout de texte à une zone de texte.
La réponse que je présente ici se comporte mieux à cet égard. Il s'agit d'un comportement (il nécessite donc l' assembly System.Windows.Interactivity du SDK Blend ). Il pourrait également être réécrit en utilisant les propriétés attachées.
Ceci est basé sur le code que j'ai trouvé ici .
la source
Cette implémentation simple fonctionne parfaitement pour moi:
Pour l'appliquer à tous
TextBox
, mettez le code suivant aprèsInitializeComponent();
la source
Dans le fichier App.xaml:
Dans le fichier App.xaml.cs:
Avec ce code, vous accédez à tous
TextBox
dans votre application.la source
Extrait d' ici :
Enregistrez le gestionnaire d'événements global dans le fichier App.xaml.cs:
Le gestionnaire est alors aussi simple que:
la source
Je me rends compte que c'est très ancien, mais voici ma solution qui est basée sur les espaces de nom expressions / interactivité microsoft et interactions.
Tout d'abord, j'ai suivi les instructions de ce lien pour placer les déclencheurs d'interactivité dans un style.
Ensuite, cela revient à cela
et ça
Dans mon cas, j'ai un contrôle utilisateur où se trouvent les zones de texte qui ont un code-behind. Le code-behind a la fonction de gestionnaire. J'ai donné à mon contrôle utilisateur un nom en XAML, et j'utilise ce nom pour l'élément. Cela fonctionne parfaitement pour moi. Appliquez simplement le style à n'importe quel
TextBox
endroit où vous souhaitez que tout le texte soit sélectionné lorsque vous cliquez surTextBox
.Le premier
CallMethodAction
appelle laSelectAll
méthode de la zone de texte lorsque leGotKeyboardFocus
événement seTextBox
déclenche.J'espère que ça aide.
la source
J'ai utilisé la réponse de Nils mais converti en plus flexible.
En XAML, vous pouvez utiliser comme l'un d'eux:
la source
Voici la version C # de la réponse publiée par @Nasenbaer
alors que
MyTextBox_GotFocus
le gestionnaire d'événements est affecté à l'GotFocus
événement deMyTextBox
.la source
J'ai une réponse légèrement simplifiée pour cela (avec juste le
PreviewMouseLeftButtonDown
événement) qui semble imiter les fonctionnalités habituelles d'un navigateur:En XAML, vous avez votre
TextBox
mot à dire:Dans codebehind:
la source
Essayez cette méthode d'extension pour ajouter le comportement souhaité à n'importe quel contrôle TextBox. Je ne l'ai pas encore testé intensivement, mais il semble répondre à mes besoins.
la source
J'ai beaucoup cherché la solution, j'ai trouvé quelques solutions pour tout sélectionner Mais, le problème est que lorsque nous faisons un clic droit et que nous coupons / copions après avoir sélectionné une partie du texte dans la zone de texte, il sélectionne tout même j'ai sélectionné une partie du texte. Pour résoudre ce problème, voici la solution. Ajoutez simplement le code ci-dessous dans l'événement de sélection du clavier. Cela a fonctionné pour moi.
la source
J'ai eu le même problème. Dans VB.Net, cela fonctionne facilement de cette façon:
VB XAML:
Codehind:
C # (merci à ViRuSTriNiTy)
la source
C'est de loin la solution la plus simple.
Ajoutez un gestionnaire global à l'application (App.xaml.cs) et c'est fait. Vous n'aurez besoin que de quelques lignes de code.
Utilisez donc la classe EventManager pour enregistrer un gestionnaire d'événements global contre un type (TextBox). Le gestionnaire réel est très simple:
Vérifiez ici: WPF TextBox SelectAll on Focus
J'espère que ça aide.
la source
Pour ceux qui s'intéressent à l'approche de Donnelle / Groky, mais veulent un clic à droite du dernier caractère (mais toujours dans le
TextBox
) pour placer le curseur à la fin du texte saisi, j'ai trouvé cette solution:La
GetRoundedCharacterIndexFromPoint
méthode est tirée de ce post.la source
Après avoir googlé et testé, j'ai trouvé une solution simple qui a fonctionné pour moi.
Vous devez ajouter un gestionnaire d'événements à l'
Loaded
événement de votre fenêtre de conteneur:Ensuite, vous devez créer le gestionnaire du référencé
RoutedEventHandler
dans le code précédent:Maintenant, vous pouvez ajouter la
SelectAll()
commande sur lesGotFocus
gestionnaires d'événements à n'importe quelTextBox
contrôle séparément:Votre texte est maintenant sélectionné sur focus!
Adapté de la solution Dr. WPF, MSDN Forums
la source
la source
Cela semble bien fonctionner pour moi. Il s'agit essentiellement d'un récapitulatif de certains messages antérieurs. Je viens de mettre cela dans mon fichier MainWindow.xaml.cs dans le constructeur. Je crée deux gestionnaires, un pour le clavier et un pour la souris, et j'entraîne les deux événements dans la même fonction
HandleGotFocusEvent
, qui est définie juste après le constructeur dans le même fichier.la source
Un moyen simple de remplacer le mouseDown et de tout sélectionner après un double-clic est:
la source
Essayez de mettre cela dans le constructeur de tout contrôle hébergeant votre zone de texte:
la source
S'il y a un événement qui désélectionne du texte pendant que la
OnFocus
souris est levée, je retarde généralement la sélection de tout.la source
Je les ai tous testés mais seuls les suivants ont fonctionné:
la source
GetType().Name
au lieu deis
ouas
est assez hackyJe vois qu'il y a beaucoup de réponses, mais comme approuvée, les méthodes qui devraient être utilisées sont
EditTextBoxGotCapture
avec le code suivant derrière:
la source