다음을 통해 공유


컨트롤의 포커스 스타일 지정 및 FocusVisualStyle

Windows Presentation Foundation (WPF)에서는 키보드 포커스를 받았을 때 컨트롤의 시각적 모양을 변경하기 위한 두 개의 병렬적인 메커니즘을 제공합니다. 첫 번째 메커니즘은 컨트롤에 적용되는 스타일이나 템플릿 안에 IsKeyboardFocused와 같은 속성에 대한 속성 setter를 사용하는 것입니다. 두 번째 메커니즘은 FocusVisualStyle 속성의 값으로 별도의 스타일을 제공하는 것입니다. "포커스 비주얼 스타일"은 컨트롤이나 다른 UI 요소의 시각적 트리를 교체하여 변경하지 않고 컨트롤의 맨 위에 그려지는 표시기에 대한 별도의 시각적 트리를 만듭니다. 이 항목에서는 각 메커니즘이 적합한 시나리오에 대해 설명합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • 포커스 비주얼 스타일의 용도
  • 기본 글꼴 비주얼 스타일 동작
  • 포커스 비주얼 스타일을 사용하는 시기
  • 포커스 비주얼 스타일을 만드는 방법
  • 포커스 비주얼 스타일에 대한 대안
  • 관련 항목

포커스 비주얼 스타일의 용도

포커스 비주얼 스타일 기능은 키보드 탐색을 기반으로 한 시각적 사용자 피드백을 모든 UI 요소에 적용하기 위한 공통 "개체 모델"을 제공합니다. 이는 특정 템플릿 컴퍼지션을 인식하거나 컨트롤에 새 템플릿을 적용하지 않고 작동합니다.

하지만 포커스 비주얼 스타일 기능은 컨트롤 템플릿을 인식하지 못한 상태로 채 작동하기 때문에 포커스 비주얼 스타일을 사용하여 컨트롤에 대해 표시할 수 있는 시각적 피드백에는 제한이 있습니다. 기능이 실제로 수행하는 작업은 템플릿을 통해 컨트롤의 렌더링에 의해 만들어진 시각적 트리 위에 다른 시각적 트리(표시기)를 겹치는 것입니다. 이 별도의 시각적 트리는 FocusVisualStyle 속성을 채우는 스타일을 사용하여 정의합니다.

기본 글꼴 비주얼 스타일 동작

포커스 비주얼 스타일은 포커스 작업이 키보드에 의해 시작된 경우에만 작동합니다. 마우스의 움직임이나 프로그래밍 방식의 포커스 변경이 있으면 포커스 비주얼 스타일에 대한 모드를 사용할 수 없게 됩니다. 포커스 모드 사이의 구분에 대한 자세한 내용은 포커스 개요를 참조하십시오.

컨트롤에 대한 테마에는 테마의 모든 컨트롤에 대한 포커스 비주얼 스타일이 되는 기본 포커스 비주얼 스타일 동작이 포함됩니다. 이 테마 스타일은 정적 키 FocusVisualStyleKey의 값으로 식별됩니다. 응용 프로그램 수준에서 자체 포커스 비주얼 스타일을 선언하는 경우에는 테마에서 이 기본 스타일 동작을 바꾸십시오. 또한 전체 테마를 정의하는 경우에는 동일한 키를 사용하여 전체 테마의 기본 동작에 대한 스타일을 정의해야 합니다.

테마에서 기본 포커스 비주얼 스타일은 일반적으로 매우 간단합니다. 다음은 개괄적인 샘플입니다.

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

포커스 비주얼 스타일을 사용하는 시기

개념적으로, 컨트롤에 적용되는 포커스 비주얼 스타일의 모양은 컨트롤 간에 일관되어야 합니다. 일관성을 유지하는 한 가지 방법은 전체 테마를 구성하는 경우에만 포커스 비주얼 스타일을 변경하는 것입니다. 이 경우 테마에 정의된 각 컨트롤은 매우 동일한 포커스 비주얼 스타일 또는 컨트롤 간에 시각적으로 관련된 스타일의 약간의 변화를 가져옵니다. 또는 동일한 스타일(또는 비슷한 스타일)을 사용하여 페이지 또는 UI의 모든 키보드 포커스 가능 요소에 스타일을 적용할 수 있습니다.

테마에 속하지 않는 개별 컨트롤 스타일에 대해 FocusVisualStyle을 설정하는 것은 포커스 비주얼 스타일의 원래 용도가 아닙니다. 시각적 동작이 컨트롤 간에 일관되지 않으면 키보드 포커스와 관련하여 사용자에게 혼란을 줄 수 있습니다. 테마 간에 일관되지 않도록 키보드 포커스에 대해 컨트롤 특정 동작을 사용하려는 경우 더 좋은 방법은 개별 입력 상태 속성에 대한 스타일에 IsFocused 또는 IsKeyboardFocused와 같은 트리거를 사용하는 것입니다.

포커스 비주얼 스타일은 키보드 포커스에 대해서만 작동합니다. 포커스 비주얼 스타일은 내게 필요한 옵션 기능의 한 유형입니다. 마우스, 키보드 또는 프로그래밍 방식 중 무엇을 사용하는지에 관계 없이 모든 종류의 포커스에 대해 UI를 변경하려는 경우에는 포커스 비주얼 스타일을 사용하지 않아야 하며, 대신 IsFocused 또는 IsFocusWithin과 같은 일반 포커스 속성의 값에서 작동하는 스타일 또는 템플릿에 setter와 트리거를 사용해야 합니다.

포커스 비주얼 스타일을 만드는 방법

포커스 비주얼 스타일에 대해 만든 스타일은 항상 ControlTargetType을 가지고 있어야 합니다. 스타일은 주로 ControlTemplate으로 구성되어야 합니다. 포커스 비주얼 스타일이 FocusVisualStyle에 할당되는 형식이 되도록 대상 형식을 지정하지 마십시오.

대상 형식은 항상 Control이기 때문에 모든 컨트롤에 공통적인 속성을 사용하여 스타일을 적용해야 합니다(Control 클래스 및 기본 클래스의 속성 사용). UI 요소에 대한 오버레이로 올바르게 작동하며 컨트롤의 기능 영역을 가리지 않는 템플릿을 만들어야 합니다. 일반적으로 이는 시각적 피드백이 컨트롤 여백의 바깥쪽에 나타나야 하거나 포커스 비주얼 스타일이 적용되는 컨트롤에서 적중 테스트를 차단하지 않는 과다하지 않거나 임시적인 효과로 나타나야 한다는 것을 의미합니다. 오버레이 템플릿의 크기 및 위치를 결정하는 데 도움이 되는 템플릿 바인딩에서 사용할 수 있는 속성에는 ActualHeight, ActualWidth, MarginPadding이 있습니다.

포커스 비주얼 스타일에 대한 대안

단일 컨트롤에만 스타일을 적용하고 있거나 컨트롤 템플릿에 대한 제어 수준을 높이고자 하기 때문에 포커스 비주얼 스타일을 사용하는 것이 적합하지 않은 경우에 포커스 변경에 따라 시각적 동작을 만들 수 있는 많은 액세스 가능한 속성과 기술이 있습니다.

트리거, setter 및 이벤트 setter에 대해서는 스타일 지정 및 템플릿에서 자세히 살펴보겠습니다. 라우트된 이벤트 처리는 라우트된 이벤트 개요를 참조하십시오.

IsKeyboardFocused

키보드 포커스에 관심이 있는 경우 속성 TriggerIsKeyboardFocused 종속성 속성을 사용할 수 있습니다. 스타일 또는 템플릿의 속성 트리거는 단일 컨트롤에 한정되며 다른 컨트롤의 키보드 포커스 동작과 시각적으로 일치하지 않을 수 있는 키보드 포커스 동작의 정의에 더 적합한 기술입니다.

다른 비슷한 종속성 속성은 IsKeyboardFocusWithin으로, 키보드 포커스가 컨트롤의 기능 영역 또는 합성 영역 내 어딘가에 있음을 시각적으로 보이고자 할 때 사용하기 적합합니다. 예를 들어 IsKeyboardFocusWithin 트리거를 배치하여 몇 개의 컨트롤을 그룹화하는 패널이 다르게 표시되도록 할 수 있습니다. 이 경우 키보드 포커스는 해당 패널 내의 개별 요소에 더 정밀하게 위치할 수 있습니다.

또한 이벤트 GotKeyboardFocusLostKeyboardFocus(그리고 해당 미리 보기 이벤트)도 사용할 수 있습니다. 이러한 이벤트를 EventSetter의 기반으로 사용하거나 코드 숨김에서 이벤트용 처리기를 작성할 수 있습니다.

기타 포커스 속성

시각적 동작 생성을 위한 포커스 변경의 가능한 모든 요인을 포괄하려는 경우 IsFocused 종속성 속성 또는 EventSetter에 대해 사용되는 GotFocus 또는 LostFocus 이벤트를 기반으로 setter 또는 트리거를 사용해야 합니다.

참고 항목

참조

FocusVisualStyle

개념

스타일 지정 및 템플릿

포커스 개요

입력 개요

기타 리소스

내게 필요한 옵션