Sdílet prostřednictvím


Styly pro fokus v ovládacích prvcích a FocusVisualStyle

Windows Presentation Foundation (WPF) poskytuje dva paralelní mechanismy pro změnu vizuálního vzhledu ovládacího prvku při příjmu fokusu klávesnice. Prvním mechanismem je použití nastavovačů vlastností pro vlastnosti, jako je IsKeyboardFocused, v rámci stylu nebo šablony aplikované na ovládací prvek. Druhým mechanismem je poskytnout samostatný styl jako hodnotu vlastnosti FocusVisualStyle, "vizuální styl zaměření" vytvoří samostatný vizuální strom pro ozdobný objekt, který se vykreslí nad ovládacím prvkem, místo změny vizuálního stromu ovládacího prvku nebo jiného prvku uživatelského rozhraní jeho nahrazením. Toto téma popisuje scénáře, ve kterých je každý z těchto mechanismů vhodný.

Účel vizuálního stylu zaostření

Funkce stylu zaměření poskytuje společný "objektový model" pro poskytnutí vizuální zpětné vazby uživateli na základě klávesnicové navigace na jakýkoli prvek uživatelského rozhraní. To je možné bez použití nové šablony na ovládací prvek nebo znalost konkrétní složení šablony.

Přesně proto, že funkce vizuálního stylu fokusu funguje bez znalosti šablon ovládacích prvků, je vizuální zpětná vazba, kterou lze zobrazit pro ovládací prvek pomocí vizuálního stylu fokusu, nutně omezená. Co funkce vlastně dělá, je překrytí jiného vizuálního stromu (ozdoba) nad vizuálním stromem vytvořeným vykreslováním ovládacího prvku přes jeho šablonu. Tento samostatný vizuální strom definujete pomocí stylu, který vyplní vlastnost FocusVisualStyle.

Výchozí chování vizuálního stylu fokusu

Vizuální styly fokusu fungují jenom v případech, kdy byla akce fokusu inicializována klávesnicí. Jakákoli akce myši nebo změna fokusu programu zakáže režim pro vizuální styly fokusu. Další informace o rozdílech mezi režimy zaostření najdete v tématu Přehled zaostření.

Motivy ovládacích prvků zahrnují výchozí chování vizuálního stylu fokusu, které se stane vizuálním stylem fokusu pro všechny ovládací prvky v motivu. Tento styl motivu je identifikován hodnotou statického klíče FocusVisualStyleKey. Když deklarujete vlastní vizuální styl zaměření na úrovni aplikace, nahradíte toto výchozí chování stylu z motivů. Pokud definujete celý motiv, měli byste použít stejný klíč k definování stylu výchozího chování pro celý motiv.

Ve výchozích motivech je vizuální styl fokusu obecně velmi jednoduchý. Následuje přibližná aproximace:

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

Kdy použít vizuální styly zaostření

Koncepčně by vzhled vizuálních stylů fokusu použitých na ovládací prvky měl být koherentní od ovládacího prvku po ovládací prvek. Jedním ze způsobů, jak zajistit soudržnost, je změnit vizuální styl fokusu pouze v případě, že vytváříte celý motiv, kde každý ovládací prvek definovaný v motivu získá stejný vizuální styl fokusu nebo nějakou variantu stylu, který vizuálně souvisí z ovládacího prvku na ovládací prvek. Alternativně můžete použít stejný styl (nebo podobné styly) ke stylu každého prvku s fokusem na klávesnici na stránce nebo v uživatelském rozhraní.

Nastavení FocusVisualStyle u jednotlivých stylů ovládacích prvků, které nejsou součástí motivu, není zamýšlené použití vizuálních stylů fokusu. Důvodem je to, že nekonzistentní vizuální chování mezi ovládacími prvky může vést k matoucímu uživatelskému prostředí týkajícímu se fokusu klávesnice. Pokud máte v úmyslu řídit chování specifické pro ovládací prvek, které záměrně nejsou koherentní napříč tématem, je mnohem lepší použít spouštěče ve stylech pro konkrétní vlastnosti stavů vstupu, například IsFocused nebo IsKeyboardFocused.

Fokus vizuálních stylů se aktivuje výhradně pro zaměření klávesnice. Styly zaměření tedy jsou typem funkce přístupnosti. Pokud chcete změny uživatelského rozhraní pro libovolný typ fokusu, ať už prostřednictvím myši, klávesnice nebo programově, neměli byste používat vizuální styly fokusu a měli byste místo toho používatttery a triggery ve stylech nebo šablonách, které pracují z hodnoty obecných vlastností fokusu, jako jsou IsFocused nebo IsKeyboardFocusWithin.

Vytvoření vizuálního stylu zaostření

Styl, který vytvoříte pro vizuální styl fokusu, by měl mít vždy TargetTypeControl. Styl by se měl skládat především z ControlTemplate. Nespecifikujete cílový typ jako ten typ, na který je styl vizuálního fokusu přiřazen k FocusVisualStyle.

Vzhledem k tomu, že cílový typ je vždy Control, je nutné použít styl pomocí vlastností, které jsou společné pro všechny ovládací prvky (pomocí vlastností třídy Control a jejích základních tříd). Měli byste vytvořit šablonu, která bude správně fungovat jako překryvný prvek uživatelského rozhraní a která nebude překrývat funkční oblasti ovládacího prvku. Obecně to znamená, že vizuální zpětná vazba by se měla objevit mimo okraje ovládacího prvku nebo jako dočasné nebo nenápadné efekty, které nebrání testování zásahů na ovládacím prvku, kde je použit vizuální styl zaměření. Vlastnosti, které můžete použít v vazbě šablony, které jsou užitečné pro určení velikosti a umístění překryvné šablony, zahrnují ActualHeight, ActualWidth, Margina Padding.

Alternativy k použití vizuálního stylu zaostření

V situacích, kdy použití vizuálního stylu fokusu není vhodné, protože stylujete jenom jednotlivé ovládací prvky nebo chcete mít větší kontrolu nad šablonou ovládacího prvku, existuje mnoho dalších přístupných vlastností a technik, které můžou vytvořit vizuální chování v reakci na změny v fokusu.

Triggery, settery a settery událostí jsou podrobně popsány v stylování a šablonování. Zpracování směrovaných událostí je popsáno v přehledu událostí routed.

JeKlávesniceZaměřena

Pokud vás konkrétně zajímá fokus klávesnice, lze vlastnost IsKeyboardFocused závislostí použít pro vlastnost Trigger. Aktivátor vlastnosti ve stylu nebo šabloně je vhodnější technikou pro definování chování zaměření klávesnice, které je velmi specifické pro jeden ovládací prvek, a které nemusí vizuálně odpovídat chování zaměření klávesnice pro jiné ovládací prvky.

Další podobná vlastnost závislosti je IsKeyboardFocusWithin, což může být vhodné použít, pokud chcete vizuálně zvýraznit, že fokus klávesnice je někde uvnitř složené oblasti nebo ve funkční oblasti ovládacího prvku. Můžete například umístit trigger IsKeyboardFocusWithin tak, aby se panel, který seskupuje několik ovládacích prvků, vypadal jinak, i když fokus klávesnice může být přesněji na jednotlivé prvky v tomto panelu.

Můžete také použít události GotKeyboardFocus a LostKeyboardFocus (a také jejich ekvivalenty ve verzi Preview). Tyto události můžete použít jako základ pro EventSetternebo můžete psát obslužné rutiny pro události v kódu.

Další vlastnosti fokusu

Pokud chcete, aby všechny možné příčiny změny fokusu vyvolávaly vizuální chování, měli byste založit setter nebo trigger na vlastnosti závislosti IsFocused, případně na událostech GotFocus nebo LostFocus použitých pro EventSetter.

Viz také