La sélection d'une zone de texte d'un Élément dans une zone de liste ne pas modifier l'élément sélectionné de la liste
J'Ai un wpf zone de liste afficher une liste des zones de texte. Quand je clique sur la zone de texte de la zone de liste de sélection ne change pas. Je dois cliquer à côté de la zone de texte pour sélectionner la zone de liste de l'élément. Est-il une propriété que je dois mettre pour la zone de texte de l'avant l'événement click du contrôle Listbox?
InformationsquelleAutor | 2009-03-17
Vous devez vous connecter pour publier un commentaire.
Nous utilisons le style suivant pour définir un PreviewGotKeyboardFocus qui gère tous les événements de contrôle de zone de texte et les zones de liste modifiables et tel:
Et ensuite, sélectionnez la ligne dans le code behind:
Assurez-vous d'utiliser des TargetType: ListViewItem, ListBoxItem ou TreeViewItem.
Je n'ai pas assez de répétitions pour le commentaire, je suis donc de poster mon commentaire de réponse. Grazer la solution ci-dessus ne fonctionne pas dans le cas où vous avez une autre option comme un
Button
qui a besoin de l'SelectedItem
. C'est parce que, comme par leStyle Trigger
, leIsKeyboardFocusWithin
devient faux si vous cliquez sur ceButton
, et laSelectedItem
devient nulle.J'ai utilisé similaire à Robert de la solution, mais sans code derrière (à l'aide de comportement attaché).
Pour ce faire,
Premier. Créer une catégorie distincte FocusBehaviour:
Seconde. Ajouter un style dans la section des ressources (mon style est arrondi en noir sur la mise au point). Avis setter pour FocusBehaviour.IsListBoxItemSelected de la propriété. Vous devez le référencer dans
xmlns:behave="clr-namespace:MyBehaviours"
`
`
Troisième. (facultatif, pour inverser la tâche)
Vous rencontrerez, si pas tout, inverser la tâche en se concentrant sur la zone de texte lorsque ListBoxItem d'être sélectionné.
Je recommande d'utiliser une autre propriété de Comportement de la classe, IsFocused. Voici un exemple de modèle pour
ListBoxItem
, s'il vous plaît avisProperty="behave:FocusBehaviour.IsFocused"
etFocusManager.IsFocusScope="True"
J'utilise une classe de gestionnaire pour définir ce comportement. Cette façon de faire va résoudre tous les affichages de liste dans l'application. Je ne sais pas pourquoi ce n'est pas le comportement par défaut.
Dans votre Application.xaml.cs, ajoutez ce qui suit à OnStartup:
Ce n'est pas une simple propriété, mais vous pouvez gérer la
GotFocus
événement sur votreTextBox
, puis utilisez VisualTreeHelper pour trouver leListBoxItem
et sélectionner:La façon la plus simple que j'ai pu trouver pour faire ceci est d'utiliser le PreviewMouseDown événement et définissez la propriété IsSelected de l'basées sur des modèles de parent. Depuis l'aperçu des événements de la bulle vers le bas, le ListBoxItem traiterons le cas dès que l'utilisateur clique sur la zone de texte, zone de liste déroulante, ou n'importe quel autre contrôle que vous définissez l'événement.
Une belle chose à ce sujet est que vous pouvez utiliser les mêmes pour tous les types de commandes car elles dérivent toutes du Cadre de l'élément. Aussi, IsSelected (au lieu de définir la SelectedItem) sera la cause de plusieurs éléments pour être sélectionné lorsque vous définissez le SelectionMode de la zone de liste pour "Extended", qui pourrait ou pourrait ne pas être ce que vous cherchez.
ie:
de code c#
xaml
c'est la réponse que vous cherchez: La sélection d'un ListBoxItem lors de son intérieure de la zone de liste déroulante est concentré
Ce qui suit est une simplification de @Ben la réponse sans avoir à remplacer le DataTemplate. Elle peut même être appliquée comme un style statique. Testé avec une liste contenant un
GridView > GridViewColumn > TextBox
.Exemple:
La zone de liste des poignées de sélection d'élément, mais ne savent pas à propos de l'accent de la zone de texte incorporé à l'intérieur. Si vous souhaitez modifier la sélection à chaque fois qu'une zone de texte reçoit le focus d'entrée, puis vous avez besoin de changer la zone de liste à sélection manuelle, autant que je sache.
Je n'en suis pas complètement sûr que vous voulez définir la sélection directement comme indiqué dans la réponse précédente, parce que je pense qu'il serait briser la multisélection et quelques autres scenerios
. Vous voudrez peut-être essayer un relooking un bouton comme ci-dessous et voir ce qui se passe.
Votre pas très précis au sujet de votre situation de départ. Mais je suppose que vous utilisez la liaison de données et un ItemTemplate. C'est à mon humble avis un moyen facile de le faire, et si votre débutant sur ce sujet. Cela devrait fonctionner:
Essayez ce code:
Vieille discussion, mais peut-être que ma réponse qui aide les autres....
Ben la solution a le même problème que Grazer de la solution. La mauvaise chose est que la sélection dépend de la [clavier] focus de la zone de texte. Si vous avez un autre contrôle sur votre boîte de dialogue (c'est à dire un bouton), le focus est perdu lorsque vous cliquez sur le bouton et le listboxitem devient non-sélectionné (SelectedItem == null). Si vous avez un comportement différent pour cliquant sur l'élément (en dehors de la zone de texte) et en cliquant dans la zone de texte. C'est très fastidieux à manipuler et très étrange.
Je suis tout à fait sûr qu'il n'y est pas de pure XAML solution pour cela. Nous avons besoin de code-behind pour cela. La solution est proche de ce que Mark a suggéré.
(dans mon exemple, j'utilise ListViewItem au lieu de ListBoxItem, mais la solution fonctionne pour les deux).
Code-behind:
avec FindParent (prises de http://www.infragistics.com/community/blogs/blagunas/archive/2013/05/29/find-the-parent-control-of-a-specific-type-in-wpf-and-silverlight.aspx ):
Dans mon DataTemplate:
Attaché comportement basé sur des Arcturus Répondre pour le rendre réutilisables, et à ne l'ai pas caché dans le code derrière.
Créer un fichier avec le comportement attaché (= propriété attachée)
Ajouter aux ressources de votre goût.
Par exemple
<Windows.Resources>
Ajouter de l'espace de noms
si visual studio n'est pas assez intelligent pour l'ajouter automatiquement. par exemple, quand votre projet est appelé "MyApp" et vous avez enregistré le fichier dans le Dossier "MyBehaviors", l'espace de Noms sous la Fenêtre: