Xamarin.Forms Shell 탐색

Download Sample 샘플 다운로드

Xamarin.Forms Shell에는 설정된 탐색 계층 구조를 따르지 않고도 애플리케이션의 모든 페이지로 이동하는 데 경로를 사용하는 URI 기반 탐색 환경이 포함됩니다. 또한 탐색 스택의 모든 페이지를 방문하지 않고도 뒤로 이동할 수 있는 기능을 제공합니다.

Shell 클래스는 다음과 같은 탐색 관련 속성을 정의합니다.

BackButtonBehavior, CurrentItem, CurrentState 속성은 BindableProperty 개체에서 지원되며 이러한 속성이 데이터 바인딩의 대상일 수 있음을 의미합니다.

Shell 클래스에서 GoToAsync 메서드를 호출하여 탐색을 수행합니다. 탐색을 수행하려고 하면 Navigating 이벤트가 발생하고 탐색이 완료되면 Navigated 이벤트가 발생합니다.

참고 항목

Navigation 속성을 사용하여 Shell 애플리케이션의 페이지 간에 탐색을 수행할 수도 있습니다. 자세한 내용은 계층적 탐색을 참조하세요.

경로

이동할 URI를 지정하여 셸 애플리케이션에서 탐색을 수행합니다. 탐색 URI에는 세 가지 구성 요소가 포함될 수 있습니다.

  • 경로 - 셸 시각적 계층 구조의 일부로 존재하는 콘텐츠의 경로를 정의합니다.
  • 페이지. 셸 시각적 계층 구조에 없는 페이지는 셸 애플리케이션 내의 어디에서나 탐색 스택으로 푸시할 수 있습니다. 예를 들어 세부 정보 페이지는 Shell 시각적 계층 구조에 정의되지 않지만, 필요에 따라 탐색 스택으로 푸시할 수 있습니다.
  • 하나 이상의 쿼리 매개 변수. 쿼리 매개 변수는 탐색하는 동안 대상 페이지에 전달할 수 있는 매개 변수입니다.

탐색 URI에 세 가지 구성 요소가 모두 포함되는 경우 구조체는 //route/page?queryParameters입니다.

경로 등록

경로는 FlyoutItem, TabBar, TabShellContent 개체에서 해당 Route 속성을 통해 정의할 수 있습니다.

<Shell ...>
    <FlyoutItem ...
                Route="animals">
        <Tab ...
             Route="domestic">
            <ShellContent ...
                          Route="cats" />
            <ShellContent ...
                          Route="dogs" />
        </Tab>
        <ShellContent ...
                      Route="monkeys" />
        <ShellContent ...
                      Route="elephants" />  
        <ShellContent ...
                      Route="bears" />
    </FlyoutItem>
    <ShellContent ...
                  Route="about" />                  
    ...
</Shell>

참고 항목

셸 계층 구조의 모든 항목에는 연결된 경로가 있습니다. 경로를 설정하지 않으면 런타임에 생성됩니다. 그러나 생성된 경로가 다른 애플리케이션 세션에서 일관된다는 보장은 없습니다.

위 예제에서는 프로그래밍 방식 탐색에 사용할 수 있는 다음 경로 계층 구조를 만듭니다.

animals
  domestic
    cats
    dogs
  monkeys
  elephants
  bears
about

dogs 경로의 ShellContent 개체로 이동하려면 절대 경로 URI는 //animals/domestic/dogs입니다. 마찬가지로, about 경로의 ShellContent 개체로 이동하려면 절대 경로 URI는 //about입니다.

Warning

중복 경로가 검색되는 경우 애플리케이션 시작 시 ArgumentException이 throw됩니다. 이 예외는 계층 구조의 동일한 수준에 있는 두 개 이상의 경로가 경로 이름을 공유하는 경우에도 throw됩니다.

세부 정보 페이지 경로 등록

Shell 서브클래스 생성자 또는 경로가 호출되기 전에 실행되는 다른 위치에서는 Shell 시각적 계층 구조에 표시되지 않는 모든 세부 정보 페이지에 대해 추가 경로를 명시적으로 등록할 수 있습니다. 이렇게 하려면 Routing.RegisterRoute 메서드를 사용합니다.

Routing.RegisterRoute("monkeydetails", typeof(MonkeyDetailPage));
Routing.RegisterRoute("beardetails", typeof(BearDetailPage));
Routing.RegisterRoute("catdetails", typeof(CatDetailPage));
Routing.RegisterRoute("dogdetails", typeof(DogDetailPage));
Routing.RegisterRoute("elephantdetails", typeof(ElephantDetailPage));

이 예제에서는 Shell 서브클래스에 정의되지 않은 세부 정보 페이지를 경로로 등록합니다. 그러면 애플리케이션 내 어디에서나 URI 기반 탐색을 사용하여 이러한 세부 정보 페이지로 이동할 수 있습니다. 이러한 페이지의 경로를 전역 경로라고 합니다.

Warning

Routing.RegisterRoute 메서드가 둘 이상의 다른 형식에 대해 동일한 경로를 등록하려고 하면 ArgumentException이 throw됩니다.

또는 필요한 경우 다른 경로 계층 구조에서 페이지를 등록할 수 있습니다.

Routing.RegisterRoute("monkeys/details", typeof(MonkeyDetailPage));
Routing.RegisterRoute("bears/details", typeof(BearDetailPage));
Routing.RegisterRoute("cats/details", typeof(CatDetailPage));
Routing.RegisterRoute("dogs/details", typeof(DogDetailPage));
Routing.RegisterRoute("elephants/details", typeof(ElephantDetailPage));

이 예제에서는 monkeys 경로에 대한 페이지에서 details 경로로 이동하면 MonkeyDetailPage가 표시되는 상황별 페이지 탐색을 사용하도록 설정합니다. 마찬가지로, elephants 경로에 대한 페이지에서 details 경로로 이동하면 ElephantDetailPage가 표시됩니다. 자세한 내용은 상황별 탐색을 참조하세요.

참고 항목

Routing.RegisterRoute 메서드를 사용하여 경로를 등록한 페이지는 필요한 경우 Routing.UnRegisterRoute 메서드를 사용하여 등록을 취소할 수 있습니다.

탐색 수행

탐색을 수행하려면 먼저 Shell 서브클래스에 대한 참조를 가져와야 합니다. 이 참조는 App.Current.MainPage 속성을 Shell 개체에 캐스팅하거나 Shell.Current 속성을 통해 가져올 수 있습니다. 그런 다음 Shell 개체에서 GoToAsync 메서드를 호출하여 탐색을 수행할 수 있습니다. 이 메서드는 ShellNavigationState로 이동하여 탐색 애니메이션이 완료된 후 완료될 Task를 반환합니다. ShellNavigationState 개체는 string 또는 Uri에서 GoToAsync 메서드를 통해 생성되고 해당 Location 속성이 string 또는 Uri 인수로 설정되어 있습니다.

Important

셸 시각적 계층 구조의 경로로 이동하면 탐색 스택이 생성되지 않습니다. 그러나 셸 시각적 계층 구조에 없는 페이지로 이동하면 탐색 스택이 생성됩니다.

Shell 개체의 현재 탐색 상태는 표시된 경로의 URI를 Location 속성에 포함하는 Shell.Current.CurrentState 속성을 통해 검색할 수 있습니다.

절대 경로

유효한 절대 URI를 GoToAsync 메서드의 인수로 지정하여 탐색을 수행할 수 있습니다.

await Shell.Current.GoToAsync("//animals/monkeys");

이 예제에서는 monkeys 경로에 대한 페이지로 이동하며 경로는 ShellContent 개체에 정의됩니다. monkeys 경로를 나타내는 ShellContent 개체는 경로가 animalsFlyoutItem 개체의 자식입니다.

상대 경로

유효한 상대 URI를 GoToAsync 메서드의 인수로 지정하여 탐색을 수행할 수도 있습니다. 라우팅 시스템은 URI를 ShellContent 개체와 일치시키려고 합니다. 따라서 애플리케이션의 모든 경로가 고유할 경우 고유한 경로 이름을 상대 URI로 지정하기만 하면 탐색을 수행할 수 있습니다.

다음 상대 경로 형식이 지원됩니다.

서식 설명
route 지정된 경로에 대한 경로 계층 구조가 현재 위치에서 위쪽으로 검색됩니다. 일치하는 페이지가 탐색 스택에 푸시됩니다.
/route 지정된 경로에서 경로 계층 구조가 현재 위치에서 아래쪽으로 검색됩니다. 일치하는 페이지가 탐색 스택에 푸시됩니다.
//route 지정된 경로에 대한 경로 계층 구조가 현재 위치에서 위쪽으로 검색됩니다. 일치하는 페이지가 탐색 스택을 대체합니다.
///route 지정된 경로에 대한 경로 계층 구조가 현재 위치에서 아래쪽으로 검색됩니다. 일치하는 페이지가 탐색 스택을 대체합니다.

다음 예제에서는 monkeydetails 경로에 대한 페이지로 이동합니다.

await Shell.Current.GoToAsync("monkeydetails");

이 예제에서는 일치 페이지가 발견될 때까지 monkeyDetails 경로가 계층 구조 위쪽으로 검색됩니다. 찾은 페이지는 탐색 스택에 푸시됩니다.

상황별 탐색

상대 경로를 사용하여 상황별 탐색을 수행할 수 있습니다. 예를 들어 다음 경로 계층 구조를 고려합니다.

monkeys
  details
bears
  details

monkeys 경로의 등록된 페이지가 표시될 때 details 경로로 이동하면 monkeys/details 경로의 등록된 페이지가 표시됩니다. 마찬가지로, bears 경로의 등록된 페이지가 표시될 때 details 경로로 이동하면 bears/details 경로의 등록된 페이지가 표시됩니다. 이 예제에서 경로를 등록하는 방법에 대한 자세한 내용은 페이지 경로 등록을 참조하세요.

뒤로 탐색

뒤로 탐색은 GoToAsync 메서드의 인수로 ".."를 지정하여 수행할 수 있습니다.

await Shell.Current.GoToAsync("..");

“..”를 사용한 뒤로 탐색은 경로와 결합할 수도 있습니다.

await Shell.Current.GoToAsync("../route");

이 예제에서는 뒤로 탐색을 수행한 다음 지정된 경로로 이동합니다.

Important

지정된 경로로 이동하기 위해 뒤로 탐색이 경로 계층 구조의 현재 위치에 있는 경우에만 뒤로 탐색 및 지정된 경로로 탐색을 수행할 수 있습니다.

마찬가지로 여러 번 뒤로 이동한 다음, 지정된 경로로 이동할 수 있습니다.

await Shell.Current.GoToAsync("../../route");

이 예제에서는 뒤로 탐색을 두 번 수행한 다음 지정된 경로로 이동합니다.

또한 뒤로 탐색할 때 쿼리 속성을 통해 데이터를 전달할 수 있습니다.

await Shell.Current.GoToAsync($"..?parameterToPassBack={parameterValueToPassBack}");

이 예에서는 뒤로 탐색을 수행하고 쿼리 매개 변수 값을 이전 페이지의 쿼리 매개 변수에 전달합니다.

참고 항목

쿼리 매개 변수는 뒤로 탐색 요청에 추가할 수 있습니다.

탐색할 때 데이터를 전달하는 방법에 대한 자세한 내용은 데이터 전달을 참조하세요.

잘못된 경로

다음 경로 형식은 유효하지 않습니다.

형식 설명
//page 또는 ///page 현재는 전역 경로가 탐색 스택의 유일한 페이지가 될 수 없습니다. 따라서 전역 경로에 대한 절대 라우팅은 지원되지 않습니다.

이러한 경로 형식을 사용하면 Exception이 throw됩니다.

Warning

존재하지 않는 경로로 이동하려고 하면 ArgumentException 예외가 throw됩니다.

탐색 디버그

일부 셸 클래스는 디버거에서 클래스나 필드를 표시하는 방식을 지정하는 DebuggerDisplayAttribute로 데코레이팅됩니다. 이 특성을 사용하면 탐색 요청에 관련된 데이터를 표시하여 탐색 요청을 디버그할 수 있습니다. 예를 들어 다음 스크린샷은 Shell.Current 개체의 CurrentItemCurrentState 속성을 보여 줍니다.

Screenshot of debugger

이 예제에서 FlyoutItem 형식의 CurrentItem 속성은 FlyoutItem 개체의 제목 및 경로를 표시합니다. 마찬가지로 ShellNavigationState 형식의 CurrentState 속성은 Shell 애플리케이션 내에 표시된 경로의 URI를 표시합니다.

Tab 클래스는 Tab 내의 현재 탐색 스택을 나타내는 IReadOnlyList<Page> 형식의 Stack 속성을 정의합니다. 또한 이 클래스는 다음 재정의 가능한 탐색 메서드를 제공합니다.

  • GetNavigationStack, 현재 탐색 스택을 반환 IReadOnlyList<Page>합니다.
  • OnInsertPageBefore - INavigation.InsertPageBefore가 호출될 때 호출됩니다.
  • OnPopAsync - Task<Page>를 반환하고 INavigation.PopAsync가 호출될 때 호출됩니다.
  • OnPopToRootAsync - Task를 반환하고 INavigation.OnPopToRootAsync가 호출될 때 호출됩니다.
  • OnPushAsync - Task를 반환하고 INavigation.PushAsync가 호출될 때 호출됩니다.
  • OnRemovePage - INavigation.RemovePage가 호출될 때 호출됩니다.

다음 예제에서는 OnRemovePage 메서드를 재정의하는 방법을 보여 줍니다.

public class MyTab : Tab
{
    protected override void OnRemovePage(Page page)
    {
        base.OnRemovePage(page);

        // Custom logic
    }
}

이 예제에서 MyTab 개체는 Shell 시각적 계층 구조에서 Tab 개체 대신 사용됩니다.

Shell 클래스는 프로그래밍 방식 탐색이나 사용자 조직으로 인해 탐색이 수행되려고 할 때 발생하는 Navigating 이벤트를 정의합니다. Navigating 이벤트와 함께 제공되는 ShellNavigatingEventArgs 개체는 다음 속성을 제공합니다.

속성 Type 설명
Current ShellNavigationState 현재 페이지의 URI입니다.
Source ShellNavigationSource 발생한 탐색의 형식입니다.
Target ShellNavigationState 탐색의 목적지를 나타내는 URI입니다.
CanCancel bool 탐색을 취소할 수 있는지 여부를 나타내는 값입니다.
Cancelled bool 탐색이 취소되었는지를 나타내는 값입니다.

또한 ShellNavigatingEventArgs 클래스는 탐색을 취소하는 데 사용할 수 있는 Cancel 메서드와 탐색을 완료하는 데 사용할 수 있는 ShellNavigatingDeferral 토큰을 반환하는 GetDeferral 메서드를 제공합니다. 탐색 지연에 대한 자세한 내용은 탐색 지연을 참조하세요.

Shell 클래스는 탐색이 완료될 때 발생하는 Navigated 이벤트도 정의합니다. Navigated 이벤트와 함께 제공되는 ShellNavigatedEventArgs 개체는 다음 속성을 제공합니다.

속성 Type 설명
Current ShellNavigationState 현재 페이지의 URI입니다.
Previous ShellNavigationState 이전 페이지의 URI입니다.
Source ShellNavigationSource 발생한 탐색의 형식입니다.

Important

OnNavigating 메서드는 Navigating 이벤트가 발생할 때 호출됩니다. 마찬가지로 OnNavigated 메서드는 Navigated 이벤트가 발생할 때 호출됩니다. 두 메서드 모두 Shell 서브클래스에서 재정의하여 탐색 요청을 가로챌 수 있습니다.

ShellNavigatedEventArgsShellNavigatingEventArgs 클래스에는 둘 다 ShellNavigationSource 형식의 Source 속성이 있습니다. 이 열거형은 다음 값을 제공합니다.

  • Unknown
  • Push
  • Pop
  • PopToRoot
  • Insert
  • Remove
  • ShellItemChanged
  • ShellSectionChanged
  • ShellContentChanged

따라서 OnNavigating 재정의에서 탐색을 가로채고 탐색 소스에 따라 작업을 수행할 수 있습니다. 예를 들어 다음 코드는 페이지의 데이터가 저장되지 않은 경우 역방향 탐색을 취소하는 방법을 보여 줍니다.

protected override void OnNavigating(ShellNavigatingEventArgs args)
{
    base.OnNavigating(args);

    // Cancel any back navigation.
    if (args.Source == ShellNavigationSource.Pop)
    {
        args.Cancel();
    }
// }

셸 탐색은 가로챌 수 있고 사용자 선택에 따라 완료 또는 취소할 수 있습니다. 이렇게 하려면 Shell 서브클래스에서 OnNavigating 메서드를 재정의하고 ShellNavigatingEventArgs 개체에서 GetDeferral 메서드를 호출합니다. 이 메서드는 탐색 요청을 완료하는 데 사용할 수 있는 Complete 메서드가 있는 ShellNavigatingDeferral 토큰을 반환합니다.

public MyShell : Shell
{
    // ...
    protected override async void OnNavigating(ShellNavigatingEventArgs args)
    {
        base.OnNavigating(args);

        ShellNavigatingDeferral token = args.GetDeferral();

        var result = await DisplayActionSheet("Navigate?", "Cancel", "Yes", "No");
        if (result != "Yes")
        {
            args.Cancel();
        }
        token.Complete();
    }    
}

이 예제에서는 사용자에게 탐색 요청을 완료하거나 취소하라고 안내하는 작업 시트가 표시됩니다. 탐색을 취소하려면 ShellNavigatingEventArgs 개체에서 Cancel 메서드를 호출합니다. 탐색은 ShellNavigatingEventArgs 개체의 GetDeferral 메서드에 의해 검색된 ShellNavigatingDeferral 토큰에서 Complete 메서드를 호출하여 완료합니다.

Warning

GoToAsync 메서드는 보류 중인 탐색 지연이 있을 때 사용자가 탐색하려고 하면 InvalidOperationException을 throw합니다.

데이터 전달

URI 기반 프로그래밍 방식 탐색을 수행할 때 데이터를 쿼리 매개 변수로 전달할 수 있습니다. 경로 뒤에 ?를 추가하고 쿼리 매개 변수 ID, =, 값을 차례로 추가하면 됩니다. 예를 들어 다음 코드는 사용자가 ElephantsPage에서 코끼리를 선택할 때 샘플 애플리케이션에서 실행됩니다.

async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string elephantName = (e.CurrentSelection.FirstOrDefault() as Animal).Name;
    await Shell.Current.GoToAsync($"elephantdetails?name={elephantName}");
}

이 코드 예제는 CollectionView에서 현재 선택된 코끼리를 검색하고 elephantdetails 경로로 이동하여 elephantName을 쿼리 매개 변수로 전달합니다.

아래의 두 가지 방법으로 탐색 데이터를 수신할 수 있습니다.

  1. 탐색 중인 페이지를 나타내는 클래스 또는 페이지의 BindingContext에 대한 클래스를 각 쿼리 매개 변수에 대해 QueryPropertyAttribute로 데코레이트할 수 있습니다. 자세한 내용은 쿼리 속성 특성을 사용하여 탐색 데이터 처리를 참조하세요.
  2. 탐색 중인 페이지를 나타내는 클래스 또는 페이지의 BindingContext에 대한 클래스는 IQueryAttributable 인터페이스를 구현할 수 있습니다. 자세한 내용은 단일 메서드를 사용하여 탐색 데이터 처리를 참조하세요.

쿼리 속성 특성을 사용하여 탐색 데이터 처리

각 쿼리 매개 변수에 대해 QueryPropertyAttribute로 수신 클래스를 데코레이팅하여 탐색 데이터를 받을 수 있습니다.

[QueryProperty(nameof(Name), "name")]
public partial class ElephantDetailPage : ContentPage
{
    public string Name
    {
        set
        {
            LoadAnimal(value);
        }
    }
    ...

    void LoadAnimal(string name)
    {
        try
        {
            Animal animal = ElephantData.Elephants.FirstOrDefault(a => a.Name == name);
            BindingContext = animal;
        }
        catch (Exception)
        {
            Console.WriteLine("Failed to load animal.");
        }
    }    
}

첫 번째 인수 QueryPropertyAttribute 는 데이터를 받을 속성의 이름을 지정하고 두 번째 인수는 쿼리 매개 변수 ID를 지정합니다. 따라서 QueryPropertyAttribute 위의 예제에서는 속성이 메서드 호출의 Name URI GoToAsync 에서 name 쿼리 매개 변수에 전달된 데이터를 받도록 지정합니다. Name 속성 setter는 LoadAnimal 메서드를 호출하여 name에 대한 Animal 개체를 검색하고 페이지의 BindingContext으로 설정합니다.

참고 항목

QueryPropertyAttribute를 통해 받은 쿼리 매개 변수 값은 자동으로 URL로 디코딩됩니다.

단일 메서드를 사용하여 탐색 데이터 처리

수신 클래스에서 IQueryAttributable 인터페이스를 구현하여 탐색 데이터를 받을 수 있습니다. IQueryAttributable 인터페이스는 구현하는 클래스가 ApplyQueryAttributes 메서드를 구현하도록 지정합니다. 이 메서드에는 탐색 중에 전달된 데이터를 포함하는 IDictionary<string, string> 형식의 query 인수가 있습니다. 사전의 각 키는 쿼리 매개 변수 ID이며 해당 값은 쿼리 매개 변수 값이 됩니다. 이 접근 방식을 사용하는 경우의 이점은 단일 메서드를 사용하여 탐색 데이터를 처리할 수 있다는 것입니다. 이는 일률적으로 처리해야 하는 여러 개의 탐색 데이터 항목이 있는 경우에 유용할 수 있습니다.

다음 예제는 IQueryAttributable 인터페이스를 구현하는 뷰 모델 클래스를 보여 줍니다.

public class MonkeyDetailViewModel : IQueryAttributable, INotifyPropertyChanged
{
    public Animal Monkey { get; private set; }

    public void ApplyQueryAttributes(IDictionary<string, string> query)
    {
        // The query parameter requires URL decoding.
        string name = HttpUtility.UrlDecode(query["name"]);
        LoadAnimal(name);
    }

    void LoadAnimal(string name)
    {
        try
        {
            Monkey = MonkeyData.Monkeys.FirstOrDefault(a => a.Name == name);
            OnPropertyChanged("Monkey");
        }
        catch (Exception)
        {
            Console.WriteLine("Failed to load animal.");
        }
    }
    ...
}

이 예제에서 ApplyQueryAttributes 메서드는 GoToAsync 메서드 호출의 URI에서 name 쿼리 매개 변수의 값을 검색합니다. 그런 다음 LoadAnimal 메서드를 호출하여 Animal 개체를 검색합니다. 여기서 개체는 데이터가 바인딩되는 Monkey 속성의 값으로 설정됩니다.

Important

IQueryAttributable 인터페이스를 통해 받은 쿼리 매개 변수 값은 자동으로 URL로 디코딩되지 않습니다.

여러 쿼리 매개 변수 전달 및 처리

여러 쿼리 매개 변수는 &로 연결하여 전달할 수 있습니다. 예를 들어 다음 코드는 두 데이터 항목을 전달합니다.

async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string elephantName = (e.CurrentSelection.FirstOrDefault() as Animal).Name;
    string elephantLocation = (e.CurrentSelection.FirstOrDefault() as Animal).Location;
    await Shell.Current.GoToAsync($"elephantdetails?name={elephantName}&location={elephantLocation}");
}

이 코드 예제는 CollectionView에서 현재 선택된 코끼리를 검색하고 elephantdetails 경로로 이동하여 elephantNameelephantLocation을 쿼리 매개 변수로 전달합니다.

여러 데이터 항목을 수신하려면 탐색 중인 페이지를 나타내는 클래스 또는 페이지의 BindingContext에 대한 클래스를 각 쿼리 매개 변수에 대해 QueryPropertyAttribute로 데코레이트하면 됩니다.

[QueryProperty(nameof(Name), "name")]
[QueryProperty(nameof(Location), "location")]
public partial class ElephantDetailPage : ContentPage
{
    public string Name
    {
        set
        {
            // Custom logic
        }
    }

    public string Location
    {
        set
        {
            // Custom logic
        }
    }
    ...    
}

이 예제에서 클래스는 각 쿼리 매개 변수에 대해 QueryPropertyAttribute로 데코레이트됩니다. 첫 번째 QueryPropertyAttributeName 속성이 name 쿼리 매개 변수에 전달된 데이터를 수신하도록 지정하고 두 번째 QueryPropertyAttributeLocation 속성이 location 쿼리 매개 변수에 전달된 데이터를 수신하도록 지정합니다. 두 경우 모두 쿼리 매개 변수 값은 GoToAsync 메서드 호출의 URI에 지정됩니다.

또는 탐색 중인 페이지를 나타내는 클래스 또는 페이지의 BindingContext에 대한 클래스에서 IQueryAttributable 인터페이스를 구현함으로써 단일 메서드로 탐색 데이터를 처리할 수 있습니다.

public class ElephantDetailViewModel : IQueryAttributable, INotifyPropertyChanged
{
    public Animal Elephant { get; private set; }

    public void ApplyQueryAttributes(IDictionary<string, string> query)
    {
        string name = HttpUtility.UrlDecode(query["name"]);
        string location = HttpUtility.UrlDecode(query["location"]);
        ...        
    }
    ...
}

이 예제에서 ApplyQueryAttributes 메서드는 GoToAsync 메서드 호출의 URI에서 namelocation 쿼리 매개 변수의 값을 검색합니다.

뒤로 단추 동작

뒤로 단추 모양과 동작은 BackButtonBehavior 연결된 속성을 BackButtonBehavior 개체로 설정하여 재정의할 수 있습니다. BackButtonBehavior 클래스는 다음 속성을 정의합니다.

  • ICommand 형식의 Command - 뒤로 단추를 누를 때 실행됩니다.
  • object 형식의 CommandParameter - Command에 전달되는 매개 변수입니다.
  • ImageSource 형식의 IconOverride - 뒤로 단추에 사용되는 아이콘입니다.
  • boolean 형식의 IsEnabled - 뒤로 단추를 사용할 수 있는지를 나타냅니다. 기본값은 true입니다.
  • string 형식의 TextOverride - 뒤로 단추에 사용되는 텍스트입니다.

이 모든 속성은 BindableProperty 개체에서 지원되며, 이는 속성이 데이터 바인딩의 대상이 될 수 있음을 의미합니다.

다음 코드에서는 뒤로 단추 모양 및 동작을 재정의하는 예제를 보여 줍니다.

<ContentPage ...>    
    <Shell.BackButtonBehavior>
        <BackButtonBehavior Command="{Binding BackCommand}"
                            IconOverride="back.png" />   
    </Shell.BackButtonBehavior>
    ...
</ContentPage>

해당하는 C# 코드는 다음과 같습니다.

Shell.SetBackButtonBehavior(this, new BackButtonBehavior
{
    Command = new Command(() =>
    {
        ...
    }),
    IconOverride = "back.png"
});

Command 속성은 뒤로 단추를 누를 때 실행될 ICommand로 설정되고 IconOverride 속성은 뒤로 단추에 사용되는 아이콘으로 설정됩니다.

Screenshot of a Shell back button icon override, on iOS and Android