Style dla Fokusu w formantach i FocusVisualStyle

Program Windows Presentation Foundation (WPF) udostępnia dwa równoległe mechanizmy zmiany wyglądu wizualizacji kontrolki po odebraniu fokusu klawiatury. Pierwszy mechanizm polega na użyciu ustawiaczy właściwości dla właściwości, takich jak IsKeyboardFocused styl lub szablon, który jest stosowany do kontrolki. Drugi mechanizm polega na udostępnieniu oddzielnego stylu jako wartości FocusVisualStyle właściwości; "styl wizualizacji fokusu" tworzy oddzielne drzewo wizualne dla modułu adoratora, który korzysta z kontrolki, a nie zmienia drzewa wizualnego kontrolki lub innego elementu interfejsu użytkownika, zastępując go. W tym temacie omówiono scenariusze, w których każdy z tych mechanizmów jest odpowiedni.

Cel stylu wizualizacji fokusu

Funkcja stylu wizualizacji fokusu udostępnia wspólny "model obiektów" umożliwiający wprowadzenie wizualnych opinii użytkowników na podstawie nawigacji za pomocą klawiatury do dowolnego elementu interfejsu użytkownika. Jest to możliwe bez stosowania nowego szablonu do kontrolki lub znajomości konkretnej kompozycji szablonu.

Jednak właśnie dlatego, że funkcja stylu wizualizacji fokusu działa bez znajomości szablonów kontrolek, opinie wizualne, które mogą być wyświetlane dla kontrolki przy użyciu stylu wizualizacji fokusu, muszą być ograniczone. Faktycznie funkcja polega na nakładaniu innego drzewa wizualnego (modułu adoratora) na drzewo wizualizacji utworzonego przez renderowanie kontrolki za pośrednictwem szablonu. To oddzielne drzewo wizualne definiuje się przy użyciu stylu, który wypełnia FocusVisualStyle właściwość .

Domyślne zachowanie stylu wizualizacji fokusu

Style wizualizacji fokusu działają tylko wtedy, gdy akcja fokusu została zainicjowana przez klawiaturę. Każda akcja myszy lub zmiana fokusu programowego wyłącza tryb stylów wizualizacji fokusu. Aby uzyskać więcej informacji na temat różnic między trybami koncentracji uwagi, zobacz Omówienie fokusu.

Motywy kontrolek obejmują domyślne zachowanie stylu wizualizacji fokusu, które staje się stylem wizualizacji fokusu dla wszystkich kontrolek w motywie. Ten styl motywu jest identyfikowany przez wartość klucza FocusVisualStyleKeystatycznego . W przypadku deklarowania własnego stylu wizualizacji fokusu na poziomie aplikacji należy zastąpić to domyślne zachowanie stylu motywów. Alternatywnie, jeśli zdefiniujesz cały motyw, użyj tego samego klucza, aby zdefiniować styl domyślnego zachowania dla całego motywu.

W motywach domyślny styl wizualizacji fokusu jest zazwyczaj bardzo prosty. Poniżej przedstawiono przybliżone przybliżenie:

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

Kiedy używać stylów wizualnych fokusu

Koncepcyjnie wygląd stylów wizualizacji fokusu zastosowanych do kontrolek powinien być spójny z kontrolą i kontrolą. Jednym ze sposobów zapewnienia spójności jest zmiana stylu wizualizacji fokusu tylko wtedy, gdy komponujesz cały motyw, w którym każda kontrolka zdefiniowana w motywie pobiera ten sam styl wizualizacji fokusu lub jakąś odmianę stylu, który jest wizualnie powiązany z kontrolką do kontrolki. Alternatywnie możesz użyć tego samego stylu (lub podobnych stylów), aby stylizować każdy element z możliwością koncentracji uwagi klawiatury na stronie lub w interfejsie użytkownika.

Ustawienie FocusVisualStyle dla poszczególnych stylów kontrolek, które nie są częścią motywu, nie jest zamierzonym użyciem stylów wizualizacji fokusu. Dzieje się tak, ponieważ niespójne zachowanie wizualne między kontrolkami może prowadzić do mylącego środowiska użytkownika dotyczącego koncentracji uwagi na klawiaturze. Jeśli zamierzasz używać zachowań specyficznych dla kontrolek dla fokusu klawiatury, które celowo nie są spójne w obrębie motywu, znacznie lepszym podejściem jest użycie wyzwalaczy w stylach dla poszczególnych właściwości stanu danych wejściowych, takich jak IsFocused lub IsKeyboardFocused.

Style wizualizacji fokusu działają wyłącznie dla fokusu klawiatury. W związku z tym style wizualizacji fokusu są typem funkcji ułatwień dostępu. Jeśli chcesz zmienić interfejs użytkownika dla dowolnego typu fokusu, czy za pomocą myszy, klawiatury lub programowo, nie należy używać stylów wizualizacji fokusu i zamiast tego należy używać ustawiaczy i wyzwalaczy w stylach lub szablonach, które działają na podstawie wartości ogólnych właściwości fokusu, takich jak IsFocused lub IsKeyboardFocusWithin.

Jak utworzyć styl wizualizacji fokusu

Styl tworzony dla stylu wizualizacji fokusu powinien zawsze mieć TargetType wartość Control. Styl powinien składać się głównie z .ControlTemplate Nie określasz typu docelowego, który ma być typem, w którym styl wizualizacji fokusu jest przypisany do elementu FocusVisualStyle.

Ponieważ typ docelowy jest zawsze Control, należy styl przy użyciu właściwości wspólnych dla wszystkich kontrolek (przy użyciu właściwości Control klasy i jej klas bazowych). Należy utworzyć szablon, który będzie działał prawidłowo jako nakładka elementu interfejsu użytkownika i który nie będzie ukrywać obszarów funkcjonalnych kontrolki. Ogólnie rzecz biorąc, oznacza to, że opinie wizualne powinny pojawiać się poza marginesami sterowania lub jako tymczasowe lub nieprawdziwe efekty, które nie blokują testowania trafień w kontrolce, w której zastosowano styl wizualizacji fokusu. Właściwości, których można użyć w powiązaniu szablonu, które są przydatne do określania rozmiaru i pozycjonowania szablonu nakładki, obejmują ActualHeight, ActualWidth, Margini Padding.

Alternatywy dla używania stylu wizualnego koncentracji uwagi

W sytuacjach, w których używanie stylu wizualizacji fokusu nie jest odpowiednie, ponieważ używasz tylko pojedynczych kontrolek lub chcesz mieć większą kontrolę nad szablonem kontrolki, istnieje wiele innych dostępnych właściwości i technik, które mogą tworzyć zachowanie wizualne w odpowiedzi na zmiany fokusu.

Wyzwalacze, zestawy i zestawy zdarzeń zostały szczegółowo omówione w temacie Styling and Templating (Styleing and Templating). Obsługa zdarzeń trasowanych jest omawiana w temacie Routed Events Overview (Omówienie zdarzeń trasowanych).

IsKeyboardFocused

Jeśli interesuje Cię fokus klawiatury, IsKeyboardFocused właściwość zależności może być używana dla właściwości Trigger. Wyzwalacz właściwości w stylu lub szablonie jest bardziej odpowiednią techniką definiowania zachowania fokusu klawiatury, która jest bardzo specyficzna dla pojedynczej kontrolki i która może nie być wizualnie zgodna z zachowaniem fokusu klawiatury dla innych kontrolek.

Inną podobną właściwością zależności jest IsKeyboardFocusWithin, która może być odpowiednia do użycia, jeśli chcesz wizualnie wywołać fokus klawiatury, znajduje się gdzieś w komposiowaniu lub w obszarze funkcjonalnym kontrolki. Na przykład można umieścić IsKeyboardFocusWithin wyzwalacz tak, aby panel, który grupuje kilka kontrolek, wyglądał inaczej, mimo że fokus klawiatury może być bardziej precyzyjny dla pojedynczego elementu w tym panelu.

Możesz również użyć zdarzeń GotKeyboardFocus i LostKeyboardFocus (a także ich odpowiedników w wersji zapoznawczej). Tych zdarzeń można użyć jako podstawy dla EventSetterelementu lub można pisać programy obsługi zdarzeń w kodzie.

Inne właściwości fokusu

Jeśli chcesz, aby wszystkie możliwe przyczyny zmiany fokusu w celu utworzenia zachowania wizualnego, należy zastosować metodę ustawiającą lub wyzwalaną dla IsFocused właściwości zależności albo alternatywnie na GotFocus zdarzeniach LostFocus lub używanych dla elementu EventSetter.

Zobacz też