Question

ItemsControl de WPF affiche un rectangle de focus lorsqu'il pense qu'il est actif et que l'utilisateur appuie sur Tab ou sur Alt.

Cependant, un élément récemment affiché par ItemsControl était un rectangle de focus, même s'il n'avait pas le focus , à l'instar de l'un de ses parents. ItemsControl était à l'intérieur d'un UserControl, qui était dans un autre UserControl que avait activé. Quelque chose comme ça:

<!-- UserControl1.xaml; this is the control that has focus -->
<UserControl x:Class="UserControl1" Focusable="True" ...>
    <UserControl2/>
</UserControl>

<!-- UserControl2.xaml -->
<UserControl x:Class="UserControl2">
    <ItemsControl .../>
</UserControl>

Ou, pour afficher l’imbrication visuellement:

+---------------------------------------------------+
| UserControl1 (has focus)                          |
|                                                   |
| +-----------------------------------------------+ |
| | UserControl2                                  | |
| |                                               | |
| | +-------------------------------------------+ | |
| | | ItemsControl (shows focus rectangle)      | | |

Il m'a fallu un certain temps (et une question StackOverflow ) pour comprendre d'où venait le rectangle de focus, car je ne m'attendais pas à ce qu'un contrôle sans focus ait un rectangle de focus.

J'apprends toujours à maîtriser WPF et, bien évidemment, je ne le connais pas encore suffisamment, sinon cela ne m'aurait pas dérouté. Deux questions pour m'aider à comprendre:

  1. Pourquoi ItemsControl affiche-t-il un rectangle de focus alors qu'il n'a pas le focus, alors que l'un de ses contrôles parent le fait? Quelle est la raison de cette fonctionnalité? (Je suis sûr qu'il y en a un - peut-être quelque chose à voir avec des modèles ou des arbres visuels? - Je n'ai pas encore une compréhension suffisante de la mécanique et de la philosophie de WPF.)
  2. Comment cela fonctionne-t-il? Quel est le mécanisme utilisé par ItemsControl pour décider de l’affichage d’un rectangle de focus?
Était-ce utile?

La solution

Êtes-vous sûr que le contrôle ItemsControl n'est pas activé? Si cela attire l'attention, il le devrait. Ce n’est pas parce qu’un contrôle situé plus haut dans l’arbre visuel est focalisé que l’un de ses enfants n’est pas aussi concentré. Pour comprendre pourquoi, assurez-vous d’avoir bien compris la différence entre " objectif logique " et "focus du clavier" dans WPF. Une explication détaillée est disponible sur MSDN.

Autres conseils

Je pense que c'est par conception. D'après ce que je comprends, le focus est hérité du contrôle parent et se répercute dans l'arborescence visuelle. Essayez d'examiner le style visuel du parent itemscontrol, puis le contrôle lui-même pour voir ce qui se passe dans l'arborescence visuelle de xaml. Cela devrait révéler des indices sur ce qui se passe. Vous pouvez aussi essayer de chercher sur Google et d'autres sites des informations sur le focus et le contrôle des éléments, etc. Il peut y avoir d'autres informations qui donnent plus de détails sur la façon dont tout cela est plus clair que sur la manière dont je peux l'expliquer. Que se passe-t-il si vous cliquez sur le contrôle des éléments, puis cliquez ailleurs, puis sur le parent? Un changement de focus? Vous pouvez également essayer de créer une classe personnalisée qui annule le focus et fait en sorte que le contrôle ne montre pas le focus de la même manière. Devrait être (assez) facile à faire. Il peut y avoir des informations à ce sujet sur certains sites / blogs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top