Sdílet prostřednictvím


Nastavení stylů 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žít vlastnosti setter pro vlastnosti, jako IsKeyboardFocused je například v rámci stylu nebo šablony použité u ovládacího prvku. Druhým mechanismem je poskytnout samostatný styl jako hodnotu FocusVisualStyle vlastnosti; "vizuální styl fokusu" vytvoří samostatný vizuální strom pro ozdobný prvek, který se nakreslí nad ovládacím prvkem, a ne změnou vizuálního stromu ovládacího prvku nebo jiného prvku uživatelského rozhraní 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 fokusu

Funkce vizuálního stylu fokusu poskytuje společný "objektový model" pro představení zpětné vazby uživatelů vizuálu na základě navigace pomocí klávesnice na libovolný 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á. Funkce vlastně slouží k překrytí jiného vizuálního stromu (adorner) nad strom vizuálu vytvořený vykreslováním ovládacího prvku prostřednictvím jeho šablony. Tento samostatný vizuální strom definujete pomocí stylu, který tuto vlastnost vyplní 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 rozlišení mezi detailními režimy najdete v tématu Přehled fokusu.

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

V motivech je výchozí styl vizuálu 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 fokusu

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 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 plánujete chování specifické pro řízení pro fokus klávesnice, které záměrně nejsou koherentní napříč motivem, je mnohem lepší použít triggery ve stylech pro jednotlivé vlastnosti stavu vstupu, například IsFocused nebo IsKeyboardFocused.

Detailní vizuální styly fungují výhradně pro fokus klávesnice. Styly vizuálů fokusu jsou proto 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 IsFocused je nebo IsKeyboardFocusWithin.

Vytvoření vizuálního stylu fokusu

Styl, který vytvoříte pro vizuální styl fokusu, by měl mít TargetType vždy možnost Control. Styl by měl obsahovat především ControlTemplate. Nezadávejte cílový typ, který má být typem, ve kterém je styl vizuálu fokusu přiřazen .FocusVisualStyle

Vzhledem k tomu, že cílový typ je vždy Control, musíte styl pomocí vlastností, které jsou společné pro všechny ovládací prvky (pomocí vlastností Control třídy 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 nepřerušující efekty, které neblokují testování hitů na ovládacím prvku, ve kterém je použit styl vizuálu fokusu. 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 fokusu

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 setter událostí jsou podrobně popsány v tématu Styling a Šablonování. Zpracování směrovaných událostí je popsáno v přehledu směrovaných událostí.

IsKeyboardFocused

Pokud vás konkrétně zajímá fokus klávesnice, IsKeyboardFocused lze vlastnost závislostí použít pro vlastnost Trigger. Aktivační událost vlastnosti ve stylu nebo šabloně je vhodnější technikou definování chování fokusu klávesnice, které je velmi specifické pro jeden ovládací prvek a které nemusí vizuálně odpovídat chování fokusu 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ě volat, že fokus klávesnice je někde uvnitř kompozitingu nebo v funkční oblasti ovládacího prvku. Můžete například umístit IsKeyboardFocusWithin trigger 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 objekt nebo EventSettermůž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 vytvářely vizuální chování, měli byste založit setter nebo trigger na IsFocused vlastnosti závislosti nebo případně na GotFocus událostech použitých LostFocus pro objekt EventSetter.

Viz také