VisualStateManager 클래스

정의

컨트롤에 대한 시각적 상태 간 전환에 대한 시각적 상태 및 논리를 관리합니다. 또한 컨트롤 템플릿에 대한 XAML에서 시각적 상태를 정의하는 방법인 VisualStateManager.VisualStateGroups에 대한 연결된 속성 지원을 제공합니다.

/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class VisualStateManager : DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class VisualStateManager : DependencyObject
Public Class VisualStateManager
Inherits DependencyObject
상속
Object IInspectable DependencyObject VisualStateManager
특성

Windows 요구 사항

디바이스 패밀리
Windows 10 (10.0.10240.0에서 도입되었습니다.)
API contract
Windows.Foundation.UniversalApiContract (v1.0에서 도입되었습니다.)

예제

이 예제에서는 VisualStateManager.VisualStateGroups XAML 연결된 속성을 사용하는 방법을 보여 줍니다. 그렇지 않으면 "VisualStateManager" 태그가 정의되지 않은 방법을 확인합니다. 개념적으로 VisualStateManager.VisualStateGroups는 컨트롤 템플릿에서 템플릿 루트의 직속 자식 태그로 컨트롤에 대한 시각적 상태를 포함합니다.

시각적 상태의 특정 집합에는 "PointerOver" 및 "Normal" 개체를 정의하는 "CommonStates" VisualState 라는 하나의 VisualStateGroup개체가 포함됩니다. 사용자가 포인터를 위에 ButtonGrid 놓으면 .5초 만에 녹색에서 빨간색으로 변경됩니다. 사용자가 포인터를 단추 Grid 에서 멀리 이동하면 즉시 다시 녹색으로 변경됩니다.

<ControlTemplate TargetType="Button">
  <Grid >
    <VisualStateManager.VisualStateGroups>
      <VisualStateGroup x:Name="CommonStates">

        <VisualStateGroup.Transitions>

          <!--Take one half second to transition to the PointerOver state.-->
          <VisualTransition To="PointerOver" 
                              GeneratedDuration="0:0:0.5"/>
        </VisualStateGroup.Transitions>
        
        <VisualState x:Name="Normal" />

        <!--Change the SolidColorBrush, ButtonBrush, to red when the
            Pointer is over the button.-->
        <VisualState x:Name="PointerOver">
          <Storyboard>
            <ColorAnimation Storyboard.TargetName="ButtonBrush" 
                            Storyboard.TargetProperty="Color" To="Red" />
          </Storyboard>
        </VisualState>
      </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Grid.Background>
      <SolidColorBrush x:Name="ButtonBrush" Color="Green"/>
    </Grid.Background>
  </Grid>
</ControlTemplate>
<common:LayoutAwarePage>
  <Grid>
...
    <VisualStateManager.VisualStateGroups>
    <!-- Visual states reflect the application's window size -->
      <VisualStateGroup>
        <VisualState x:Name="DefaultLayout">
           <Storyboard>
           </Storyboard>
        </VisualState>
        <VisualState x:Name="Below768Layout">
           <Storyboard>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)"
               Storyboard.TargetName="ContentRoot">
               <DiscreteObjectKeyFrame KeyTime="0">
                 <DiscreteObjectKeyFrame.Value>
                   <Thickness>20,20,20,20</Thickness>
                 </DiscreteObjectKeyFrame.Value>
               </DiscreteObjectKeyFrame>
             </ObjectAnimationUsingKeyFrames>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.HorizontalAlignment)"
               Storyboard.TargetName="FooterPanel">
               <DiscreteObjectKeyFrame KeyTime="0">
                 <DiscreteObjectKeyFrame.Value>
                    <HorizontalAlignment>Left</HorizontalAlignment>
                 </DiscreteObjectKeyFrame.Value>
               </DiscreteObjectKeyFrame>
             </ObjectAnimationUsingKeyFrames>
           </Storyboard>
         </VisualState>
       </VisualStateGroup>
     </VisualStateManager.VisualStateGroups>
   </Grid>
</common:LayoutAwarePage>

다음 코드 조각은 앱이 앱 창 너비를 감지하고 해당 정보를 사용하여 적절한 시각적 상태를 호출하는 방법을 보여 주는 XAML과 함께 사용할 코드입니다.

String state = (Window.Current.Bounds.Width > 768) ? "DefaultLayout" : "Below768Layout";
VisualStateManager.GoToState(this, state, false); // 'this' is the LayoutAwarePage, scope is page code-behind

설명

VisualStateManager는 컨트롤 작성자와 컨트롤에 사용자 지정 템플릿을 적용하는 앱 개발자를 위한 두 가지 중요한 기능을 지원합니다.

  • 컨트롤 작성자 또는 앱 개발자는 VisualStateManager.VisualStateGroups 연결된 속성을 사용하여 XAML에서 컨트롤 템플릿 정의의 루트 요소에 개체 요소를 추가 VisualStateGroup 합니다. VisualStateGroup 요소 내에서 각각 VisualState 은 컨트롤의 불연속 시각적 상태를 나타냅니다. 각 VisualState에는 사용자가 변경하거나 제어 논리에 의해 변경될 수 있는 UI 상태를 나타내는 이름이 있습니다. VisualState는 주로 .로 Storyboard구성됩니다. 이 Storyboard는 컨트롤이 해당 시각적 상태에 있을 때마다 적용해야 하는 개별 종속성 속성 값 변경을 대상으로 합니다. 예제 코드를 포함하여 XAML에서 시각적 상태를 작성하는 방법에 대한 자세한 내용은 시각적 상태에 대한 Storyboarded 애니메이션을 참조하세요.
  • 컨트롤 작성자 또는 앱 개발자는 VisualStateManager의 정적 GoToState 메서드를 호출하여 이러한 상태 간에 전환합니다. 컨트롤 작성자는 컨트롤 논리가 상태 변경을 나타내는 이벤트를 처리하거나 제어 논리가 자체적인 상태 변경을 시작할 때마다 이 작업을 수행합니다. 앱 코드가 아닌 컨트롤 정의 코드에서 이 작업을 수행하는 것이 더 일반적이므로 가능한 모든 시각적 상태와 해당 전환 및 트리거 조건이 앱 코드에 대해 기본적으로 존재하며 논리는 컨트롤에 의해 캡슐화됩니다.

대부분의 개발자는 위에서 설명한 대로 VisualStateManager API인 VisualStateManager.VisualStateGroups 중 GoToState두 가지만 사용합니다. 나머지 API는 모두 확장 지원 및 사용자 지정 VisualStateManager 만들기용입니다. 자세한 내용은 이 항목의 "사용자 지정 VisualStateManager" 섹션을 참조하세요.

Microsoft Visual Studio의 XAML 디자인 화면에서 사용하도록 설정된 스타일 복사본을 편집하는 경우 기본 템플릿의 시각적 상태는 편집 중인 XAML에 정의됩니다. 컨트롤 논리는 이러한 시각적 상태가 템플릿에 존재할 것으로 예상하므로 이러한 상태를 삭제하거나 이름을 변경하지 않도록 합니다.

시각적 상태 외에도 시각적 상태 모델에는 전환도 포함됩니다. 전환은 상태가 변경될 때 각 시각적 상태 간에 발생하는 애니메이션 동작에 의해 Storyboard 제어됩니다. 컨트롤의 시각적 상태 집합에 정의된 대로 시작 상태와 종료 상태의 각 조합에 대해 전환이 다르게 정의될 수 있습니다. 전환은 속성 요소 구문을 사용하여 XAML에서 VisualStateGroup의 속성에 의해 Transitions 정의됩니다. 대부분의 기본 컨트롤 템플릿은 전환을 정의하지 않습니다. 특별히 정의된 전환이 없는 경우 상태 간 전환은 즉시(0 기간) 발생합니다. 자세한 내용은 VisualTransition를 참조하세요.

사용자 지정 VisualStateManager

상태 간 전환에 대한 고유한 논리를 구현하려는 경우(고급 시나리오) VisualStateManager에서 상속되는 클래스를 만들 수 있습니다. 다음 지침을 따릅니다.

  • 파생 클래스는 보호된 GoToStateCore 메서드를 재정의해야 합니다. 사용자 지정 VisualStateManager의 모든 인스턴스는 메서드가 호출될 때 이 Core 논리를 GoToState 사용합니다.
  • 사용자 지정 VisualStateManager 클래스를 참조하려면 템플릿의 시각적 상태를 정의하는 VisualStateManager.VisualStateGroups 연결된 속성 사용과 함께 사용자 지정 VisualStateManager 클래스 동작을 사용할 루트 요소의 루트 요소 ControlTemplateVisualStateManager.CustomVisualStateManager 연결된 속성의 값을 설정합니다. 일반적으로 기본 XAML 생성을 통해 사용자 지정 VisualStateManager 클래스의 인스턴스를 만듭니다 Application.Resources. 그런 다음 사용자 지정 VisualStateManager 리소스의 키에 대한 {StaticResource} 태그 확장 참조를 사용하여 VisualStateManager.CustomVisualStateManager 연결된 속성이 설정됩니다.

이는 사용자 지정 VisualStateManager를 만들고 사용하기 위한 기본 요구 사항입니다. 몇 가지 동작을 더 재정의하도록 선택할 수도 있습니다.

다른 모든 API(CustomVisualStateManagerProperty, GetCustomVisualStateManager, ,GetVisualStateGroupsSetCustomVisualStateManager)는 연결된 속성 지원을 위한 인프라이며, 이를 호출하거나 아무 작업도 수행할 필요가 없습니다.

컨트롤이 아닌 요소의 시각적 상태

시각적 상태는 즉시 Control 하위 클래스가 아닌 일부 UI 영역의 상태를 변경하려는 시나리오에 유용할 수 있습니다. 메서드의 컨트롤 매개 변수 GoToState 에는 VisualStateManager가 작동하는 개체를 참조하는 서브클래스가 필요 Control 하기 때문에 이 작업을 직접 수행할 수 없습니다. PageControl 는 서브클래스이며, 하위 클래스가 없거나 PageWindow.Content 루트가 하위 클래스가 아닌 Control 컨텍스트에서 UI를 표시하는 경우는 매우 드뭅니다. 상태를 적용하려는 Window.Content 다른 콘텐츠(예: Panel)에 대한 컨테이너 또는 루트로 사용자 지정 UserControl 을 정의하는 것이 좋습니다. 그런 다음, 나머지 콘텐츠가 UserControl 해당 콘텐츠Control인지 여부에 관계없이 상태를 호출 GoToState 하고 적용할 수 있습니다. 예를 들어 부모 UserControl 속성 또는 템플릿의 SwapChainPanel 명명 SwapChainPanel 된 부분에 적용되는 명명된 상태 내에 UserControl 배치하고 선언한 경우 UI에 시각적 상태를 적용할 수 있습니다.

XAML 연결된 속성

VisualStateManager는 여러 XAML 연결된 속성에 대한 호스트 서비스 클래스입니다.

연결된 속성에 대한 XAML 프로세서 액세스를 지원하고 동일한 getset 작업을 코드에 노출하기 위해 각 XAML 연결된 속성에는 Get 및 Set 접근자 메서드 쌍이 있습니다. 코드에서 값을 얻거나 설정하는 또 다른 방법은 종속성 속성 시스템을 사용하여 식별자 필드를 종속성 속성 식별자로 호출 GetValue 하거나 SetValue 전달하는 것입니다.

연결된 속성Description
VisualStateGroups 템플릿 정의의 루트 요소에 의해 정의된 VisualStateGroup 요소의 컬렉션을 가져옵니다. 컨트롤은 일반적으로 템플릿의 일부로 정의합니다.

코드에서 이 속성을 가져올 때 GetVisualStateGroups를 사용합니다. 그러면 항목을 추가할 수 있는 컬렉션 개체가 반환됩니다. VisualStateManager.VisualStateGroups 속성 요소 사용의 자식 요소에 대한 XAML 처리 동작과 유사합니다.

이 특정 연결된 속성에 대한 공용 종속성 속성 식별자가 없으므로 GetValue를 사용하여 이 연결된 속성 값을 가져올 수 없으므로 항상 GetVisualStateGroups를 사용해야 합니다.

CustomVisualStateManager 컨트롤의 상태 간 전환을 처리하는 사용자 지정 VisualStateManager 개체를 가져오거나 설정합니다.

생성자

VisualStateManager()

VisualStateManager 클래스의 새 인스턴스를 초기화합니다.

속성

CustomVisualStateManagerProperty

VisualStateManager.CustomVisualStateManager 종속성 속성을 나타냅니다.

Dispatcher

이 개체가 CoreDispatcher 연결된 개체를 가져옵니다. 코드 CoreDispatcher 가 비 UI 스레드에서 시작되는 경우에도 UI 스레드에 액세스할 DependencyObject 수 있는 기능을 나타냅니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.Dispatcher(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

(다음에서 상속됨 DependencyObject)

연결된 속성

CustomVisualStateManager

컨트롤의 상태 간 전환을 처리하는 사용자 지정 VisualStateManager 개체를 가져오거나 설정합니다.

메서드

ClearValue(DependencyProperty)

종속성 속성의 로컬 값을 지웁니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.ClearValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

(다음에서 상속됨 DependencyObject)
GetAnimationBaseValue(DependencyProperty)

애니메이션이 활성화되지 않은 경우에 적용되는 종속성 속성에 대해 설정된 기본 값을 반환합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.GetAnimationBaseValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

(다음에서 상속됨 DependencyObject)
GetCustomVisualStateManager(FrameworkElement)

VisualStateManager.CustomVisualStateManager 연결된 속성의 값을 가져옵니다.

GetValue(DependencyProperty)

에서 종속성 속성 DependencyObject의 현재 유효 값을 반환합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.GetValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

(다음에서 상속됨 DependencyObject)
GetVisualStateGroups(FrameworkElement)

지정된 FrameworkElement개체와 연결된 개체의 VisualStateGroup 컬렉션을 검색합니다.

GoToState(Control, String, Boolean)

이름으로 새로 VisualState 요청하여 두 상태 간에 컨트롤을 전환합니다.

GoToStateCore(Control, FrameworkElement, String, VisualStateGroup, VisualState, Boolean)

파생 클래스에서 재정의되는 경우 상태 간에 컨트롤을 전환합니다.

RaiseCurrentStateChanged(VisualStateGroup, VisualState, VisualState, Control)

파생 클래스에서 재정의된 경우 지정된 VisualStateGroup클래스에서 이벤트를 발생 CurrentStateChanged 합니다.

RaiseCurrentStateChanging(VisualStateGroup, VisualState, VisualState, Control)

파생 클래스에서 재정의된 경우 지정된 VisualStateGroup클래스에서 이벤트를 발생 CurrentStateChanging 합니다.

ReadLocalValue(DependencyProperty)

로컬 값이 설정된 경우 종속성 속성의 로컬 값을 반환합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.ReadLocalValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

(다음에서 상속됨 DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

DependencyObject 인스턴스의 특정 DependencyProperty 변경 내용을 수신 대기하기 위한 알림 함수를 등록합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.RegisterPropertyChangedCallback(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

(다음에서 상속됨 DependencyObject)
SetCustomVisualStateManager(FrameworkElement, VisualStateManager)

VisualStateManager.CustomVisualStateManager 연결된 속성의 값을 설정합니다.

SetValue(DependencyProperty, Object)

에 종속성 속성 DependencyObject의 로컬 값을 설정합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.SetValue(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

(다음에서 상속됨 DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

를 호출 RegisterPropertyChangedCallback하여 이전에 등록한 변경 알림을 취소합니다.

UWP에 해당하는 WinUI 2 API: Microsoft.UI.Xaml.DependencyObject.UnregisterPropertyChangedCallback(Windows 앱 SDK WinUI의 경우 Windows 앱 SDK 네임스페이스 참조).

(다음에서 상속됨 DependencyObject)

적용 대상

추가 정보