Windows 앱
콘텐츠의 테이블 축소
콘텐츠의 테이블 확장

탐색 모델(C#/VB/C++ 및 XAML 사용)

허브 앱, 그리드 앱 및 분할 앱 프로젝트 템플릿에 사용된 탐색 모델은 XAML을 사용하는 Windows 스토어 앱에 권장되는 탐색 모델입니다. 이 모델은 중앙 프레임을 기본 창의 콘텐츠로 만들고, 사용자는 해당 프레임을 사용하여 다른 페이지로 이동합니다. 단일 프레임 탐색 모델은 보다 매끄럽고 앱과 유사한 페이지 간 전환을 제공하며, 개발자가 문제 상태를 더 쉽게 관리할 수 있도록 합니다. XAML을 사용하는 Windows 스토어 앱에서 기본 제공 탐색을 사용하는 예제 및 탐색에 대한 자세한 내용은 빠른 시작: 단일 페이지 탐색 사용을 참조하세요.

중요  이 항목의 정보는 Microsoft Visual Studio 2013에 맞게 업데이트되었습니다.

App.xaml.cs/vb/cpp 파일은 Frame을 만듭니다. 기존 프레임이 없는 경우 Frame을 현재 창의 콘텐츠가 되게 합니다. 프레임의 콘텐츠가 null이면 앱은 코드 숨김 App.xaml에 지정된 대로 홈페이지로 이동합니다. 예를 들어, 그리드 앱에서 코드는 rootFrame.Navigate(typeof(GroupedItemsPage), "AllGroups") )입니다.

설치하는 동안 SuspensionManagerFrame을 등록합니다. SuspensionManager는 그리드 앱 또는 분할 앱 템플릿의 기본 폴더에 제공되는 도우미 클래스로, 앱이 종료되면 상태를 저장하고 로드하는 데 사용되는 구현을 제공합니다.

모든 앱은 운영 체제에서 지정한 응용 프로그램 수명 주기를 이동합니다. 리소스 제약, 시스템 종료, 다시 부팅 등의 이유로 시스템에서 앱을 종료할 경우 앱을 다시 시작할 때 데이터가 복원되어야 합니다. SuspensionManager는 개발자의 이러한 작업을 도와 주기 위해 제공됩니다.

SuspensionManager는 전역 세션 상태를 캡처하여 응용 프로그램의 프로세스 수명 관리를 간소화합니다. 세션 상태는 다양한 조건에서 자동으로 지워지며, 세션 간에 전달하기에는 편리하지만 응용 프로그램이 손상되거나 업그레이드될 경우에는 삭제되어야 할 정보를 저장할 때만 사용해야 합니다. 여기에는 기본적으로 임시 UI 데이터가 포함됩니다.

SuspensionManager 에는 SessionState 및 KnownTypes라는 두 개의 속성이 있습니다.

  • SessionState는 현재 세션의 전역 세션 상태에 대한 액세스를 제공합니다. 이 상태는 SaveAsync 메서드에 의해 직렬화되고 RestoreAsync 메서드에 의해 복원됩니다. 모든 데이터는 DataContractSerialization을 사용하여 저장 및 복원되며 가능한 한 압축되어야 합니다. 또한 문자열 및 다른 자체 포함 데이터 형식을 사용하는 것이 좋습니다.
  • KnownTypes는 세션 상태를 읽고 쓸 때 SaveAsync 및 RestoreAsync 메서드에서 사용되는 DataContractSerializer에 제공되는 사용자 지정 형식 목록을 저장합니다. 초기에는 비어 있지만 직렬화 프로세스를 사용자 지정하기 위해 다른 형식이 추가될 수 있습니다.

SuspensionManager는 SessionState 사전에 상태를 저장합니다. 이 사전은 Frame에 고유하게 바인딩되는 키에 대해 FrameState를 저장합니다. 각 FrameState 사전은 해당 특정 프레임에 대한 탐색 상태에 각 페이지의 상태를 보관합니다. 각 페이지는 탐색 매개 변수와 사용자가 추가하기로 결정하는 다른 상태를 저장합니다.

즉, Frame이 만들어질 때 개발자가 해당 프레임에 대해 상태를 저장하기를 원하면 즉시 등록되어야 합니다. 이는 (SuspensionManager.RegisterFrame(rootFrame, "AppFrame")) 호출을 사용하여 등록됩니다. 각 프레임에는 프레임과 연결된 고유한 키가 있어야 합니다. 일반적으로 대부분의 앱은 단일 프레임을 갖게 되며, 두 번째 프레임을 선언할 경우에는 마찬가지로 등록해야 합니다. 프레임이 등록되면 두 개의 연결된 속성이 프레임에 설정됩니다. 첫 번째 속성은 프레임에 연결한 키이고, 두 번째 속성은 프레임에 연결될 세션 상태의 사전입니다. 이전에 등록된 프레임은 즉시 탐색 및 상태를 복원하게 됩니다. 프레임을 등록 취소할 수도 있습니다. 프레임을 등록 취소하면 모든 탐색 상태와 히스토리가 삭제됩니다.

그리고 중요한 호출 SaveAsyncRestoreAsync가 있습니다. SaveAsync는 전체 SessionState를 저장하는 데 사용됩니다. SuspensionManager.RegisterFrame을 통해 등록된 모든 프레임은 현재 탐색 스택을 보존하며, 활성 페이지에 데이터를 저장할 기회를 제공합니다. 그런 다음 SessionState는 DataContractSerializer를 사용하여 직렬화되고 ApplicationData에 정의된 대로 로컬 폴더에 저장된 파일에 기록됩니다.

RestoreAsync는 이전에 저장한 SessionState를 읽는 데 사용됩니다. RegisterFrame에 등록된 모든 프레임은 이전 탐색 상태를 복원하며, 이를 통해 해당 프레임의 활성 페이지가 상태를 복원할 수 있는 기회가 제공됩니다. 다시, SaveAsync에서처럼 DataContractSerializer는 응용 프로그램의 로컬 폴더에서 파일에 저장된 상태를 역직렬화합니다.

앱 상태를 저장하려고 시도할 때 흔히 발생하는 두 가지 오류가 있습니다.

  • 개별 페이지에서 저장된 형식은 C# 및 VB에서 DataContractSerializer로 직렬화할 수 있어야 합니다. 이를 위해서는 사용자 지정 형식을 저장하거나 복원할 수 있도록 사전에 등록해야 합니다. SuspensionManager는 컬렉션에 있는 형식을 DataContractSerializer로 전달하는 KnownTypes 컬렉션을 제공합니다. SuspensionManager가 App.xaml에 대한 코드 숨김의 OnLaunched 재정의에서 상태를 복원하기 위해 호출될 때 형식을 등록하기 좋은 위치는 앱 생성자입니다.
    
            public App()
            {
                this.InitializeComponent();
                this.Suspending += OnSuspending;
                SuspensionManager.KnownTypes.Add(typeof(MyCustomType));
            }
    
    
    
  • 탐색을 사용하여 전달된 매개 변수는 플랫폼에서 직렬화할 수 있어야 합니다. 탐색 스택을 저장하고 복원할 때는 Frame.GetNavigationState()Frame.SetNavigationState()를 호출합니다. 이러한 호출 둘 다 내부 직렬화 형식을 사용하며 Frame.Navigate()에 매개 변수로 전달되는 모든 형식은 플랫폼에서 직렬화할 수 있어야 합니다.
SuspensionManagerNavigationHelper 구현으로 래핑되어 사용됩니다.

NavigationHelper 는 다음과 같이 중요한 편의성을 제공하는 페이지 구현입니다.

  • GoBack, GoForward 및 GoHome에 대한 이벤트 처리기
  • 탐색을 위한 마우스 및 키보드 바로 가기
  • 탐색에 대한 상태 관리 및 프로세스 수명 관리

기본 보기 모델

DefaultViewModel은 모든 복합 페이지 항목 템플릿에 사용됩니다. DataContext는 페이지 자체에 정의된 DefaultViewModel에 바인딩됩니다(DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"). DefaultViewModel 속성의 유형은 개체(값)에 대한 문자열(키)의 매핑인 ObservableDictionary입니다. DefaultViewModel은 편의를 위해 제공되며, 필요한 경우 강력한 형식의 보기 모델로 변경할 수 있습니다.

그러면 각 페이지는 코드 숨김 파일에서 DefaultViewModel에 설정될 속성에 바인딩됩니다. GroupedItemsPage를 예로 들면, 이 페이지에서 CollectionViewSource에는 속성 그룹 (Source="{Binding Groups}")에 바인딩된 원본 속성이 있습니다. 그룹은 DefaultViewModel(this.DefaultViewModel["Groups"] = sampleDataGroups;)에 저장된 키와 값 쌍의 키입니다.

응용 프로그램 보기 상태를 시각적 상태로 매핑

Windows 8용으로 제공된 템플릿의 LayoutAwarePage는 보기 상태를 처리하는 코드를 제공했지만 Windows 8.1에서는 이 코드가 필요하지 않습니다. SplitPage 및 FileOpenPicker 페이지에만 보기 상태를 처리할 수 있는 코드가 포함되어 있습니다. 이제 각 페이지는 너비가 최소 500px인 모든 창 크기를 처리할 수 있습니다.

탐색

NavigationHelper는 GoBack 및 GoForward에 대한 명령을 등록합니다. 이러한 구현은 페이지와 연결된 Frame이 있는지 확인하고, 프레임이 있는 경우 Frame.GoBack() 또는 Frame.GoForward()를 호출하여 프레임이 앞뒤로 이동할 수 있는지 확인합니다. 분할 페이지에서 발생할 경우 기본 동작을 변경하도록 재정의할 수 있습니다.

NavigationHelper 또한 탐색에 일반적으로 사용되는 마우스 및 키보드 바로 가기를 등록합니다. 뒤로 마우스 단추, “ALT + 왼쪽 화살표 키” 및 이전 키보드 키는 뒤로 탐색하는 데 사용되고, 다음 마우스 단추, “ALT + 오른쪽 화살표 키” 및 다음 키보드 키는 앞으로 탐색하는 데 사용됩니다.

프로세스 수명 관리

위에서 설명된 구현을 제공하는 것 외에도 각 페이지에서 구현된 OnNavigatedTo()OnNavigatedFrom() 이벤트 처리기에서 NavigationHelper를 호출해야 합니다. 이러한 이벤트가 발생하면 NavigationHelper는 LoadState() 및 SaveState()의 페이지별 구현을 호출합니다. 각 페이지에서 이러한 함수의 구현을 사용자 지정할 수 있습니다. 이러한 함수는 각각 OnNavigatedTo()OnNavigatedFrom() 대신 사용되어야 합니다.

Frame에 페이지를 표시하려고 하면 OnNavigatedFrom()이 호출됩니다. 새 페이지로 이동할 때는 페이지에 연결된 상태를 로드합니다. 페이지가 복원 중이면 이전에 저장된 페이지 상태가 복원됩니다. 그런 다음 각 페이지가 반응할 수 있도록 LoadState가 호출됩니다. LoadState는 OnNavigatedTo로 전달되는 원래 탐색 매개 변수 및 이전 페이지 상태(있는 경우) 등 두 개의 매개 변수를 사용합니다.

Frame에 페이지를 더 이상 표시하지 않으려는 경우 OnNavigatedFrom()이 호출됩니다. 페이지에서 벗어날 경우에는 페이지가 현재 상태를 저장하도록 합니다. 빈 사전은 SaveState()로 전달됩니다. 각 페이지는 SaveState를 재정의하고 키 사전에 개체를 저장합니다(문자열을 개체로 저장). 그런 다음 이 사전은 페이지와 연결되고 SuspensionManager는 지정된 프레임에 대한 추적을 유지하는 SessionState에 추가됩니다.

참고  

  • 개별 페이지에 저장된 데이터는 DataContractSerializer에서 직렬화하는 데 사용할 수 있어야 합니다. 자세한 내용은 이 항목의 시작 부분에 있는 SuspensionManager를 참조하세요.
  • 또한 종료됨 외에 다른 이유로 앱이 종료될 경우 이 상태는 손실되므로 임시 UI 정보만 저장해야 합니다.

앱의 구조

앱의 구조를 이해하기 위해, 그리드 앱 프로젝트 템플릿으로 만든 앱을 사용하겠습니다. XAML을 사용하는 모든 Windows 스토어 앱의 시작 위치는 App.xaml 및 연결된 코드 숨김 파일에 있는 응용 프로그램 개체입니다. 앱이 만들어질 때 실행되는 첫 코드는 앱 생성자입니다. 이 코드 다음에 다양한 활성화 메서드 중 하나가 호출됩니다. 앱이 시작 화면의 타일에서 실행되면 이 메서드는 OnLaunched 이벤트입니다. 이 호출에서 Frame이 만들어지고 이전에 앱이 종료된 경우 이전 상태가 다시 로드됩니다. 그리고 첫 페이지로 이동하는 데 해당 프레임이 사용됩니다. 페이지로 이동하면 페이지의 OnNavigatedTo 이벤트 처리기가 NavigationHelper를 호출합니다. NavigationHelper는 매개 변수를 실행하고 기록하며 지정된 페이지에 대한 이전 상태 정보를 다시 로드합니다. 그런 다음 GroupedItemsPage에서 재정의되는 LoadState() 메서드를 호출합니다. 여기서 데이터가 로드되고 기본 보기 모델이 채워집니다. 다른 페이지로 이동하면 OnNavigatedFrom 이벤트 처리기는 NavigationHelper를 호출하고, 이는 SaveState()를 호출하여 이 페이지에 대한 상태를 저장합니다. SaveState()는 새 페이지로 이동한 다음 다시 LoadState() 메서드를 호출하기 전에 SplitPage 같이 임시 UI 상태를 갖는 페이지에서 재정의됩니다.

관련 항목

Windows 스토어 앱용 C#, VB 및 C++ 프로젝트 템플릿
2부: 앱 수명 주기 및 상태 관리
3부: 탐색, 레이아웃 및 보기

 

 

표시:
© 2016 Microsoft