Ne pouvez pas définir le focus à un enfant de UserControl
J'ai un UserControl
qui contient un TextBox
. Lors de ma fenêtre principale de charges je veux mettre l'accent à cette zone de texte j'ai donc ajouté Focusable="True" GotFocus="UC_GotFocus"
à la UserControl
s définition et FocusManager.FocusedElement="{Binding ElementName=login}"
de mes fenêtres principales définition. Dans le UC_GotFocus
méthode que j'ai simplement appeler .Focus()
sur le contrôle je veux me concentrer sur mais cela ne fonctionne pas.
Tous j'ai besoin de faire est d'avoir un TextBox
dans un UserControl
recevoir le focus lorsque l'application démarre.
Toute aide serait appréciée, merci.
Vous devez vous connecter pour publier un commentaire.
Récemment, j'ai résolu ce problème d'une connexion écran de démarrage est affiché via un storyboard, lorsque la fenêtre principale est chargée pour la première fois.
Je crois qu'il y avait deux clés pour le fixer. L'un était de faire de l'élément contenant l'accent portée. L'autre était de gérer la table de montage séquentiel événement Terminé pour le story-board qui a été déclenchée par la fenêtre en cours de chargement.
Ce storyboard fait le nom d'utilisateur et le mot de passe de la toile visible et puis s'en étant à 100% opaque. L'essentiel est que le nom d'utilisateur de contrôle n'était pas visible jusqu'à ce que le storyboard couru et, par conséquent, que le contrôle ne pouvait pas obtenir clavier se concentrer jusqu'à ce qu'elle était visible. Ce qui m'a jeté pour un certain temps, qu'elle avait "focus" (c'est à dire l'accent est vrai, mais il s'avère que ce n'était que le focus logique) et je ne savais pas que WPF avait le concept de logique et le focus du clavier jusqu'à ce que la lecture de Kent Boogaart de la réponse et de la recherche à Microsoft WPF texte du lien
Une fois je n'ai que la solution pour mon problème était simple:
1) Faire de l'élément contenant l'accent portée
2) Joindre le formulaire de Gestionnaire d'Événement à la table de montage
et
3) de mettre mon nom d'utilisateur zone de texte pour avoir le focus clavier dans la table de montage terminé gestionnaire d'événement.
Noter que l'appel de l'élément.Focus() des résultats de l'appel du Clavier.Focus(ce), de sorte que vous n'avez pas besoin d'appeler explicitement. Voir cette question à propos de la la différence entre le Clavier.Focus(item) et l'élément.Le Focus.
Ses stupides, mais il fonctionne:
Pop un thread qui attend un moment puis revient et définit le focus que vous voulez. Il fonctionne même dans le contexte d'un élément de l'hôte.
Tout récemment, j'ai eu une zone de liste qui abritait certains TextBlocks. Je voulais être en mesure de double-cliquer sur le bloc de texte et l'ont se transformer en une zone de texte, puis se concentrer sur et sélectionnez tout le texte afin que l'utilisateur puisse commencer à taper le nouveau nom (similaire à Adobe Couches)
De toute façon, j'ai fait ça avec un événement et cela ne fonctionnait pas. La formule magique pour moi, ici, a été de s'assurer que j'ai mis le cas de traités. Je me dis qu'il était la mise au point, mais dès que l'événement est passé sur le chemin, c'était la commutation de la logique de se concentrer.
La morale de l'histoire est, assurez-vous de marquer l'événement comme traité, qui pourrait être votre problème.
“Lors de la configuration initiale se concentrer au démarrage de l'application, l'élément reçoit le focus doit être connecté à un PresentationSource et l'élément doit avoir Focusable et IsVisible définie sur true. L'emplacement recommandé pour définir le point initial est à la charge du gestionnaire d'événement" (MSDN)
Il suffit d'ajouter un "Chargé" gestionnaire d'événement dans le constructeur de la Fenêtre de votre (ou de Contrôle), et en ce gestionnaire d'événement à appeler le Focus() la méthode sur la cible de contrôle.
depuis que j'ai essayé une fuzquat de la solution et il a trouvé le plus générique, j'ai pensé que je devais partager une version différente, puisque certains se sont plaints à la recherche de désordre. il est donc ici:
sans Fil.Dormir, pas de pool de threads. Assez propre, je l'espère. Pourrait vraiment utiliser certains rep donc je peux faire des commentaires sur d'autres peuples solutions.
Mise à JOUR:
Puisque les gens semblent aimer assez code:
maintenant, vous pouvez l'appeler comme ceci:
J'ai trouvé une bonne série de billets de blog sur WPF focus.
Ils sont tous bons à lire, mais le 3e partie traite spécifiquement de la mise au point d'un élément de l'INTERFACE utilisateur dans un UserControl.
J'ai un exemple d'application en cours d'exécution avec cette solution que je tape. Si cela ne fonctionne pas pour vous, il doit y avoir quelque chose de spécifique pour votre application ou de l'environnement qui provoque le problème. Dans votre question initiale, je pense que la liaison est à l'origine du problème.
J'espère que cette aide.
WPF prend en charge deux saveurs différentes de focus:
La
FocusedElement
propriété obtient ou définit le focus logique dans un focus portée. Je soupçonne votreTextBox
ne ont le focus logique, mais son contenant l'accent portée n'est pas la mise au point active portée. Ergo, il ne pas ont le focus du clavier.Donc la question est, avez-vous plusieurs focus étendues dans votre arborescence visuelle?
J'ai remarqué une question de mise au point spécifiquement liés à l'hébergement WPF UserControls dans ElementHosts, qui sont contenues dans un Formulaire qui est défini comme un enfant MDI via la propriété MdiParent.
Je ne suis pas sûr si c'est le même problème que d'autres font face, mais de creuser dans les détails en suivant le lien ci-dessous.
Problème avec la mise au point à l'intérieur d'un WPF UserControl hébergé dans un ElementHost dans un WindowsForms formulaire MDI enfant
Après avoir une "WPF objectif Initial Cauchemar" et basé sur les réponses à certaines questions sur la pile, le suivant est révélé pour moi d'être la meilleure solution.
Tout d'abord, ajoutez votre Application.xaml OnStartup() sont les suivantes:
Puis ajouter le "WindowLoaded' événement aussi dans l'App.xaml :
Le problème thread doit être utiliser comme WPF initiale concentrer principalement échoue en raison d'un certain cadre des conditions de course.
J'ai trouvé la solution suivante du mieux qu'il est utilisé dans le monde entier pour l'ensemble de l'application.
Espère que ça aide...
Oran
Ce qui a fait le tour pour moi a été le FocusManager.FocusedElement attribut. J'ai d'abord essayé de le mettre sur le contrôle UserControl, mais il ne fonctionne pas.
J'ai donc essayé de le mettre sur le UserControl du premier enfant de la place:
... et cela a fonctionné! 🙂
Je me suis converti fuzquat, en réponse à une méthode d'extension. Je suis l'aide de ce lieu de Focus() où la mise au point() ne fonctionne pas.
J'ai de contrôle de l'utilisateur de la pile du panneau avec deux zones de texte.Les zones de texte ont été ajoutés dans le constructeur, pas dans le code xaml. Lorsque j'essaie de me concentrer première zone de texte, rien ne s'est vraiment passé.
Le siggestion avec Chargés de l'événement pour résoudre mon problème. Juste appelé contrôle.Focus() Chargé d'événements et everthing.
En supposant que vous voulez mettre l'accent pour la zone de texte nom d'utilisateur, ainsi, l'utilisateur peut taper directement chaque fois qu'il se montre.
Dans le Constructeur de votre contrôle:
Après avoir essayé les combinaisons des suggestions ci-dessus, j'ai été en mesure fiable de régler la mise au point sur une zone de texte sur un enfant UserControl avec le suivant. En gros, donner le focus au contrôle enfant et demandez à l'enfant de UserControl donner le focus à sa zone de texte. La zone de texte accent de l'instruction a renvoyé true par lui-même, cependant, n'a pas donné le résultat souhaité jusqu'à ce que le UserControl a été donné l'accent. Je tiens également à noter que le contrôle UserControl était impossible de demander le focus pour lui-même et a dû être donnée par la Fenêtre.
Par souci de concision, j'ai laissé de côté l'inscription de l'Chargé des événements sur la Fenêtre et UserControl.
Fenêtre
UserControl
Je l'ai mis dans le PageLoaded() ou de contrôle chargé, mais je vais appeler WCF service async et à faire des trucs qui semble perdre le focus. Je dois le mettre à la fin de toutes les choses que je fais. C'est bien et tout, mais il m'arrive de faire des modifications au code et puis j'oublie que je suis aussi le réglage du curseur.
Je n'aime pas les solutions avec un réglage sur un autre onglet champ d'application pour le contrôle UserControl. Dans ce cas, vous aurez deux différents signes lors de la navigation par clavier: sur la fenêtre et l'autre - à l'intérieur de contrôle de l'utilisateur. Ma solution est tout simplement de rediriger l'accent de contrôle de l'utilisateur à l'intérieur de l'enfant de contrôle. Set de contrôle de l'utilisateur peut recevoir le focus (car, par défaut, de son faux):
et remplacer les événements de focus gestionnaires dans le code-behind:
J'ai eu le même problème avec le réglage de focus clavier sur la toile dans WPF de contrôle de l'utilisateur.
Ma solution
Focusable="True"
Dans
element_mousemove
événement de créer de façon simple de vérifier:Dans mon cas cela fonctionne très bien.