Pregunta

El control de elementos de WPF mostrará un rectángulo de enfoque cuando crea que tiene el foco y el usuario presiona Tab o Alt.

Pero recientemente tuve un ItemsControl que mostraba un rectángulo de enfoque a pesar de que no tenía foco , uno de sus padres sí. El ItemsControl estaba dentro de un UserControl, que estaba dentro de otro UserControl que tenía tenía el foco. Algo como esto:

<!-- 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>

O, para mostrar el anidamiento visualmente:

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

Me tomó un tiempo (y una pregunta StackOverflow ) para calcular fuera de donde venía el rectángulo de enfoque, porque nunca esperé que un control que no tenía el enfoque mostrara un rectángulo de enfoque.

Todavía estoy aprendiendo mi camino con WPF, y obviamente todavía no sé lo suficiente, o esto no me habría confundido. Dos preguntas para ayudarme a entender:

  1. ¿Por qué el ItemsControl muestra un rectángulo de enfoque cuando en realidad no tiene el foco, pero uno de sus controles principales sí lo hace? ¿Cuál es la razón de esta característica? (Estoy seguro de que hay uno, ¿quizás algo que ver con plantillas o árboles visuales? Todavía no entiendo lo suficiente la mecánica y la filosofía de WPF).
  2. ¿Cómo funciona? ¿Cuál es el mecanismo que utiliza ItemsControl para decidir que debería mostrar un rectángulo de enfoque?
¿Fue útil?

Solución

¿Está seguro de que ItemsControl no tiene foco? Si está dibujando un foco correcto, debería. El hecho de que un control superior en el árbol visual esté enfocado, no significa que uno de sus hijos no esté también enfocado. Para entender por qué, asegúrese de haber aprendido la diferencia entre " enfoque lógico " y " foco de teclado " en WPF. Hay una explicación exhaustiva en MSDN.

Otros consejos

Creo que esto es por diseño. Mi entendimiento es que el enfoque se hereda del control principal y se abre camino hacia el árbol visual. Intente examinar el estilo visual del elemento de control principal y luego el control de elementos para ver qué está pasando con el árbol visual de xaml. Eso debería revelar algunas pistas sobre lo que está sucediendo. También puede intentar buscar en google y en otros sitios para obtener información sobre el enfoque y el control de elementos, etc. Puede haber alguna otra información por ahí que ofrezca más detalles sobre cómo funciona todo eso es más claro que cómo puedo explicarlo. ¿Qué sucede si hace clic en el control de elementos y luego hace clic en otro lugar y luego hace clic en el elemento primario? ¿Algún cambio en el enfoque? También puedes intentar crear una clase personalizada que anule el enfoque y hacer que el control no muestre el enfoque de la misma manera. Debe ser (bastante) fácil de hacer. Puede haber información sobre eso en ciertos sitios / blogs.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top