Compartilhar via


Estilo para Foco em Controles e FocusVisualStyle

O Windows Presentation Foundation (WPF) fornece dois mecanismos paralelos para alterar a aparência visual de um controle quando ele recebe o foco do teclado. O primeiro mecanismo é usar configuradores de propriedade para propriedades como IsKeyboardFocused dentro do estilo ou template aplicado ao controle. O segundo mecanismo é fornecer um estilo separado como o valor da FocusVisualStyle propriedade; o "estilo visual de foco" cria uma árvore visual separada para um adorno que desenha sobre o controle, em vez de alterar a árvore visual do controle ou de outro elemento de interface de usuário ao substituí-la. Este tópico discute os cenários em que cada um desses mecanismos é apropriado.

A finalidade do estilo visual de foco

O recurso de estilo visual de foco fornece um "modelo de objeto" comum para introduzir feedback visual ao usuário com base na navegação do teclado para qualquer elemento de interface do usuário. Isso é possível sem aplicar um novo modelo ao controle ou conhecer a composição de modelo específica.

No entanto, precisamente porque o recurso de estilo visual de foco funciona sem conhecer os modelos de controle, o feedback visual que pode ser exibido para um controle usando um estilo visual de foco é necessariamente limitado. O que o recurso realmente faz é sobrepor uma árvore visual diferente (um adorner) sobre a árvore visual criada pela renderização de um controle através de seu template. Você define essa árvore visual separada usando um estilo que preenche a propriedade FocusVisualStyle.

Comportamento de estilo visual de foco padrão

Os estilos visuais de foco atuam somente quando a ação de foco foi iniciada pelo teclado. Qualquer ação do mouse ou alteração de foco programático desabilita o modo para estilos visuais de foco. Para obter mais informações sobre as distinções entre os modos de foco, consulte Visão geral do foco.

Os temas para controles incluem um comportamento de estilo visual de foco padrão que se torna o estilo visual de foco para todos os controles no tema. Esse estilo de tema é identificado pelo valor da chave FocusVisualStyleKeyestática. Ao declarar seu próprio estilo visual de foco no nível do aplicativo, você substitui esse comportamento de estilo padrão dos temas. Como alternativa, se você definir o tema inteiro, deverá usar essa mesma chave para definir o estilo para o comportamento padrão de todo o tema.

Nos temas, o estilo visual de foco padrão geralmente é muito simples. Veja a seguir uma aproximação 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>

Quando usar estilos visuais de foco

Conceitualmente, a aparência dos estilos visuais de foco aplicados aos controles deve ser coerente entre os controles. Uma maneira de garantir a coerência é alterar o estilo visual de foco somente se você estiver compondo um tema inteiro, em que cada controle definido no tema obtém o mesmo estilo visual de foco ou alguma variação de um estilo visualmente relacionado entre os controles. Como alternativa, você pode usar o mesmo estilo (ou estilos semelhantes) para estilizar cada elemento focalizável por teclado em uma página ou em uma interface do usuário.

Configurar FocusVisualStyle em estilos de controle individuais que não fazem parte de um tema não é a maneira correta de utilizar estilos visuais de foco. Isso ocorre porque um comportamento visual inconsistente entre controles pode levar a uma experiência confusa do usuário em relação ao foco do teclado. Se você pretende controlar comportamentos específicos para o foco do teclado que deliberadamente não são coerentes em um tema, uma abordagem muito melhor é usar gatilhos em estilos para propriedades de estado de entrada individuais, como IsFocused ou IsKeyboardFocused.

Os estilos visuais de foco operam exclusivamente para indicar o foco do teclado. Dessa forma, os estilos visuais de foco são um tipo de recurso de acessibilidade. Se você quiser alterações na interface do usuário para qualquer tipo de foco, seja por mouse, teclado ou programaticamente, não deverá usar estilos visuais de foco e deve, em vez disso, usar setters e gatilhos em estilos ou modelos que operem a partir de propriedades gerais de foco, como IsFocused ou IsKeyboardFocusWithin.

Como criar um estilo visual de foco

O estilo que você cria para um estilo visual de foco deve sempre ter o TargetType de Control. O estilo deve consistir principalmente em um ControlTemplate. Você não especifica o tipo de destino como o tipo ao qual o estilo visual de foco é atribuído ao FocusVisualStyle.

Como o tipo de destino é sempre Control, você deve definir o estilo usando propriedades comuns a todos os controles (usando propriedades da Control classe e suas classes base). Você deve criar um modelo que funcionará corretamente como uma sobreposição para um elemento de interface do usuário e que não obscurecerá áreas funcionais do controle. Em geral, isso significa que os comentários visuais devem aparecer fora das margens de controle ou como efeitos temporários ou discretos que não bloquearão o teste de ocorrência no controle em que o estilo visual de foco é aplicado. As propriedades que você pode usar na associação de modelo que são úteis para determinar o dimensionamento e o posicionamento do modelo de sobreposição incluem ActualHeight, ActualWidthe MarginPadding.

Alternativas ao uso de um estilo visual de foco

Para situações em que o uso de um estilo visual de foco não é apropriado, seja porque você está apenas estilizando controles únicos ou porque deseja ter maior controle sobre o modelo de controle, há muitas outras propriedades e técnicas acessíveis que podem criar comportamento visual em resposta a alterações no foco.

Gatilhos, definidores e definidores de eventos são discutidos detalhadamente em Estilo e Modelagem de Templates. O tratamento de eventos roteados é discutido na Visão Geral de Eventos Roteados.

IsKeyboardFocused

Se você estiver especificamente interessado no foco do teclado, a IsKeyboardFocused propriedade de dependência poderá ser usada para uma propriedade Trigger. Um gatilho de propriedade em um estilo ou modelo é uma técnica mais apropriada para definir um comportamento de foco de teclado que é especificamente para um único controle e que pode não corresponder visualmente ao foco do teclado para outros controles.

Outra propriedade de dependência semelhante é IsKeyboardFocusWithin, que pode ser apropriada para usar se você quiser destacar visualmente que o foco do teclado está em algum lugar dentro da composição ou na área funcional do controle. Por exemplo, você pode colocar um IsKeyboardFocusWithin gatilho de modo que um painel que agrupa vários controles apareça de forma diferente, mesmo que o foco do teclado possa estar mais precisamente em um elemento individual dentro desse painel.

Você também pode usar os eventos GotKeyboardFocus e LostKeyboardFocus (assim como suas versões de pré-visualização). Você pode usar esses eventos como base para um EventSetter, ou pode escrever manipuladores para os eventos no code-behind.

Outras propriedades de foco

Se você quiser que todas as possíveis causas de alteração de foco produzam um comportamento visual, deve-se basear um setter ou gatilho na propriedade de dependência IsFocused ou, como alternativa, nos eventos GotFocus ou LostFocus usados para um EventSetter.

Consulte também