Compartir a través de


Estilo de foco en controles y FocusVisualStyle

Windows Presentation Foundation (WPF) proporciona dos mecanismos paralelos para cambiar la apariencia visual de un control cuando recibe el foco del teclado. El primer mecanismo consiste en usar establecedores de propiedades para propiedades como IsKeyboardFocused dentro del estilo o la plantilla que se aplica al control. El segundo mecanismo consiste en proporcionar un estilo independiente como valor de la propiedad FocusVisualStyle: el "estilo visual de foco" crea un árbol visual independiente para un adorno que se dibuja sobre el control, en lugar de cambiar el árbol visual del control u otro elemento de interfaz de usuario reemplazándolo. En este tema se describen los escenarios en los que cada uno de estos mecanismos es adecuado.

El propósito del estilo visual enfocado

La característica de estilo visual de foco proporciona un "modelo de objetos" común para introducir comentarios visuales del usuario en función de la navegación por teclado a cualquier elemento de la interfaz de usuario. Esto es posible sin aplicar una nueva plantilla al control o conocer la composición de plantilla específica.

Sin embargo, precisamente porque la característica de estilo visual de foco funciona sin conocer las plantillas de control, los comentarios visuales que se pueden mostrar para un control mediante un estilo visual de foco son necesariamente limitados. Lo que realmente hace la característica es superponer un árbol visual diferente (un adorno) encima del árbol visual tal como lo crea la representación de un control a través de su plantilla. Defina este árbol visual independiente mediante un estilo que rellene la FocusVisualStyle propiedad .

Estilo visual de enfoque por defecto

Los estilos visuales de foco actúan solo cuando el teclado inició la acción de enfoque. Cualquier acción del ratón o cambio de foco mediante programación deshabilita el modo para los estilos visuales de foco. Para obtener más información sobre las diferencias entre los modos de enfoque, vea Información general sobre el enfoque.

Los temas de los controles incluyen un comportamiento de estilo visual de foco predeterminado que se convierte en el estilo visual de foco para todos los controles del tema. Este estilo de tema se identifica mediante el valor de la clave FocusVisualStyleKeyestática . Al declarar su propio estilo visual de foco a nivel de aplicación, reemplaza el comportamiento de estilo predeterminado de los temas. Como alternativa, si define todo el tema, debe usar esta misma clave para definir el estilo para el comportamiento predeterminado de todo el tema.

En los temas, el estilo visual de foco predeterminado suele ser muy sencillo. A continuación se muestra una aproximación aproximada:

<Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}">
  <Setter Property="Control.Template">
    <Setter.Value>
      <ControlTemplate>
        <Rectangle StrokeThickness="1"
          Stroke="Black"
          StrokeDashArray="1 2"
          SnapsToDevicePixels="true"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Cuándo usar estilos visuales de foco

Conceptualmente, la apariencia de los estilos visuales de foco aplicados a los controles debe ser coherente de un control a otro. Una manera de garantizar la coherencia es cambiar el estilo visual de foco solo si está redactando un tema completo, donde cada control definido en el tema obtiene el mismo estilo visual de foco o alguna variación de un estilo que está visualmente relacionado del control al control. Como alternativa, puede usar el mismo estilo (o estilos similares) para aplicar estilo a todos los elementos con foco de teclado en una página o en una interfaz de usuario.

Establecer FocusVisualStyle en estilos de control individuales que no forman parte de un tema no es el uso previsto de estilos visuales de foco. Esto se debe a que un comportamiento visual incoherente entre los controles puede provocar una experiencia de usuario confusa con respecto al foco del teclado. Si pretende comportamientos específicos del control para el foco de teclado que no son coherentes deliberadamente en un tema, un enfoque mucho mejor es usar desencadenadores en estilos para propiedades de estado de entrada individuales, como IsFocused o IsKeyboardFocused.

Los estilos visuales de enfoque actúan exclusivamente para el enfoque del teclado. Por lo tanto, los estilos visuales de foco son un tipo de característica de accesibilidad. Si desea cambios de interfaz de usuario para cualquier tipo de enfoque, ya sea a través del mouse, el teclado o mediante programación, no debe usar estilos visuales de foco y, en su lugar, debe usar establecedores y desencadenadores en estilos o plantillas que funcionan con el valor de propiedades generales de foco como IsFocused o IsKeyboardFocusWithin.

Cómo crear un estilo visual de foco

El estilo que cree para un estilo visual de foco siempre debe tener el TargetType de Control. El estilo debe estar formado principalmente por ControlTemplate. No se especifica el tipo de destino para que sea el tipo en el que se asigna el estilo visual de foco a FocusVisualStyle.

Dado que el tipo de destino siempre es Control, debe aplicar el estilo utilizando propiedades que sean comunes a todos los controles (haciéndose uso de las propiedades de la clase Control y sus clases base). Debe crear una plantilla que funcione correctamente como superposición a un elemento de interfaz de usuario y que no oscurezca las áreas funcionales del control. Por lo general, esto significa que los comentarios visuales deben aparecer fuera de los márgenes de control, o como efectos temporales o discretos que no bloquearán las pruebas de interacción en el control donde se aplica el estilo visual de enfoque. Las propiedades que puede usar en el enlace de plantilla que son útiles para determinar el tamaño y la posición de la plantilla de superposición incluyen ActualHeight, ActualWidth, Marginy Padding.

Alternativas al uso de un estilo visual de enfoque

En situaciones en las que el uso de un estilo visual de foco no es adecuado, ya sea porque solo aplica estilos a controles individuales o porque desea un mayor control sobre la plantilla de control, hay muchas otras propiedades y técnicas accesibles que pueden crear un comportamiento visual en respuesta a los cambios en el foco.

Todos los desencadenadores, establecedores y establecedores de eventos se describen en detalle en Estilo y plantillas. El control de eventos enrutados se describe en Información general sobre eventos enrutados.

EstáEnfocadoElTeclado

Si está interesado específicamente en el foco del teclado, la IsKeyboardFocused propiedad de dependencia se puede usar para una propiedad Trigger. Un desencadenador de propiedad en un estilo o plantilla es una técnica más adecuada para definir un comportamiento de foco de teclado que es muy específico para un solo control y que podría no coincidir visualmente con el comportamiento del foco del teclado para otros controles.

Otra propiedad de dependencia similar es IsKeyboardFocusWithin, que puede ser adecuada si desea resaltar visualmente que el enfoque del teclado está en algún lugar dentro de la composición o del área funcional del control. Por ejemplo, puede colocar un IsKeyboardFocusWithin desencadenador de forma que un panel que agrupa varios controles aparezca de forma diferente, aunque el foco del teclado pueda estar más precisamente en un elemento individual dentro de ese panel.

También puede usar los eventos GotKeyboardFocus y LostKeyboardFocus (así como sus equivalentes en versión preliminar). Puede usar estos eventos como base para un EventSettero puede escribir controladores para los eventos en código subyacente.

Otras propiedades de foco

Si desea que todas las causas posibles de cambiar el foco generen un comportamiento visual, debe basar un setter o desencadenador en la IsFocused propiedad de dependencia, o bien en los GotFocus eventos o LostFocus usados para un EventSetter.

Consulte también