Xamarin.Forms Xamarin 네이티브 프로젝트에서

Download Sample 샘플 다운로드

일반적으로 Xamarin.Forms 애플리케이션에는 파생된 ContentPage페이지가 하나 이상 포함되며 이러한 페이지는 .NET Standard 라이브러리 프로젝트 또는 공유 프로젝트의 모든 플랫폼에서 공유됩니다. 그러나 Native Forms를 ContentPage사용하면 파생된 페이지를 네이티브 Xamarin.iOS, Xamarin.Android 및 UWP 애플리케이션에 직접 추가할 수 있습니다. 네이티브 프로젝트가 .NET Standard 라이브러리 프로젝트 또는 공유 프로젝트에서 파생된 페이지를 사용하는 ContentPage것과 비교했을 때, 네이티브 프로젝트에 직접 페이지를 추가하는 장점은 네이티브 보기로 페이지를 확장할 수 있다는 것입니다. 네이티브 뷰는 코드 숨김을 사용하여 x:Name XAML에서 이름을 지정하고 참조할 수 있습니다. 네이티브 뷰에 대한 자세한 내용은 네이티브 뷰를 참조 하세요.

네이 Xamarin.FormsContentPage티브 프로젝트에서 파생 페이지를 사용하는 프로세스는 다음과 같습니다.

  1. 네이 Xamarin.Forms 티브 프로젝트에 NuGet 패키지를 추가합니다.
  2. 네이 ContentPage티브 프로젝트에 파생 페이지 및 모든 종속성을 추가합니다.
  3. Forms.Init 메서드를 호출합니다.
  4. 파생 페이지의 인스턴스를 ContentPage생성하고 iOS, CreateSupportFragment Android 또는 CreateFrameworkElement UWP용 확장 메서드 CreateViewController 중 하나를 사용하여 적절한 네이티브 형식으로 변환합니다.
  5. 네이티브 탐색 API를 ContentPage사용하여 파생 페이지의 네이티브 형식 표현으로 이동합니다.

Xamarin.Forms네이티브 프로젝트가 -derived 페이지를 생성하기 전에 메서드를 ContentPage호출 Forms.Init 하여 초기화해야 합니다. 이 작업을 수행할 시기는 주로 애플리케이션 흐름에서 가장 편리한 시기에 따라 달라집니다. 애플리케이션 시작 시 또는 파생 페이지가 생성되기 직전에 ContentPage수행할 수 있습니다. 이 문서 및 함께 제공되는 샘플 애플리케이션에서는 애플리케이션 Forms.Init 시작 시 메서드가 호출됩니다.

참고 항목

NativeForms 샘플 애플리케이션 솔루션에는 프로젝트가 포함되어 Xamarin.Forms 있지 않습니다. 대신 Xamarin.iOS 프로젝트, Xamarin.Android 프로젝트 및 UWP 프로젝트로 구성됩니다. 각 프로젝트는 네이티브 양식을 사용하여 파생 페이지를 사용하는 ContentPage네이티브 프로젝트입니다. 그러나 네이티브 프로젝트가 .NET Standard 라이브러리 프로젝트 또는 공유 프로젝트에서 파생된 페이지를 사용할 ContentPage수 없는 이유는 없습니다.

Native Forms, Xamarin.Forms 기능(예: DependencyService, MessagingCenter및 데이터 바인딩 엔진)을 사용하는 경우 모두 계속 작동합니다. 그러나 네이티브 탐색 API를 사용하여 페이지 탐색을 수행해야 합니다.

iOS

iOS에서 클래스의 재정의 FinishedLaunchingAppDelegate 는 일반적으로 애플리케이션 시작 관련 작업을 수행할 수 있는 위치입니다. 애플리케이션이 시작된 후 호출되며 일반적으로 기본 창을 구성하고 컨트롤러를 보기 위해 재정의됩니다. 다음 코드 예제에서는 샘플 애플리케이션의 AppDelegate 클래스를 보여줍니다.

[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
    public static AppDelegate Instance;
    UIWindow _window;
    AppNavigationController _navigation;

    public static string FolderPath { get; private set; }

    public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
        Forms.Init();

        // Create app-level resource dictionary.
        Xamarin.Forms.Application.Current = new Xamarin.Forms.Application();
        Xamarin.Forms.Application.Current.Resources = new MyDictionary();

        Instance = this;
        _window = new UIWindow(UIScreen.MainScreen.Bounds);

        UINavigationBar.Appearance.SetTitleTextAttributes(new UITextAttributes
        {
            TextColor = UIColor.Black
        });

        FolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));

        NotesPage notesPage = new NotesPage()
        {
            // Set the parent so that the app-level resource dictionary can be located.
            Parent = Xamarin.Forms.Application.Current
        };

        UIViewController notesPageController = notesPage.CreateViewController();
        notesPageController.Title = "Notes";

        _navigation = new AppNavigationController(notesPageController);

        _window.RootViewController = _navigation;
        _window.MakeKeyAndVisible();

        notesPage.Parent = null;
        return true;
    }
    // ...
}

FinishedLaunching 메서드에서 수행하는 작업은 다음과 같습니다.

  • Xamarin.Forms 는 메서드를 호출하여 초기화됩니다 Forms.Init .
  • Xamarin.Forms.Application 개체가 만들어지고 애플리케이션 수준 리소스 사전이 XAML에 정의된 것으로 ResourceDictionary 설정됩니다.
  • 클래스에 AppDelegate 대한 참조는 필드에 저장됩니다 staticInstance . 이는 다른 클래스가 클래스에 정의된 메서드를 호출하는 메커니즘을 AppDelegate 제공하기 위한 것입니다.
  • UIWindow네이티브 iOS 애플리케이션의 뷰에 대한 기본 컨테이너인 이 컨테이너가 만들어집니다.
  • 속성은 FolderPath 메모 데이터가 저장될 디바이스의 경로로 초기화됩니다.
  • NotesPage XAML에 정의된 파생 페이지인 개체가 만들어Xamarin.FormsContentPage지고 해당 부모가 이전에 만든 Xamarin.Forms.Application 개체로 설정됩니다.
  • NotesPage 개체는 확장 메서드를 UIViewController 사용하여 CreateViewController 변환됩니다.
  • 이 설정의 UIViewController 속성은 TitleUINavigationBar표시됩니다.
  • 계층적 탐색을 관리하기 위해 A AppNavigationController 가 만들어집니다. 에서 파생되는 사용자 지정 탐색 컨트롤러 클래스입니다 UINavigationController. 개체는 AppNavigationController 뷰 컨트롤러 스택을 관리하며 UIViewController 생성자에 전달된 개체는 로드될 때 AppNavigationController 처음에 표시됩니다.
  • 개체는 AppNavigationController 최상위 UIViewControllerUIWindow수준으로 설정되며 애플리케이션의 UIWindow 키 창으로 설정되고 표시됩니다.
  • Parent 개체의 NotesPage 속성은 메모리 누수 방지를 null위해 설정됩니다.

메서드가 FinishedLaunching 실행되면 다음 스크린샷과 같이 클래스에 Xamarin.FormsNotesPage 정의된 UI가 표시됩니다.

Screenshot shows a Notes screen on a mobile device.

Important

페이지의 속성이 개체로 설정된 경우 모든 ContentPage파생 페이지는 애플리케이션 수준에서 ResourceDictionary정의된 리소스를 Application 사용할 수 Parent 있습니다.

예를 들어 UI를 탭하여 +ButtonUI와 상호 작용하면 코드 숨김 실행에서 NotesPage 다음 이벤트 처리기가 발생합니다.

void OnNoteAddedClicked(object sender, EventArgs e)
{
    AppDelegate.Instance.NavigateToNoteEntryPage(new Note());
}

staticAppDelegate.Instance 필드를 사용하면 AppDelegate.NavigateToNoteEntryPage 다음 코드 예제에 표시된 메서드를 호출할 수 있습니다.

public void NavigateToNoteEntryPage(Note note)
{
    NoteEntryPage noteEntryPage = new NoteEntryPage
    {
        BindingContext = note,
        // Set the parent so that the app-level resource dictionary can be located.
        Parent = Xamarin.Forms.Application.Current
    };

    var noteEntryViewController = noteEntryPage.CreateViewController();
    noteEntryViewController.Title = "Note Entry";

    _navigation.PushViewController(noteEntryViewController, true);
    noteEntryPage.Parent = null;
}

이 메서드는 NavigateToNoteEntryPage -derived 페이지를 확장 메서드가 있는 UIViewController 페이지로 CreateViewController 변환Xamarin.FormsContentPage하고 TitleUIViewController. 그런 UIViewController 다음 메서드에 AppNavigationController 의해 푸시됩니다 PushViewController . 따라서 다음 스크린샷과 같이 클래스에 Xamarin.FormsNoteEntryPage 정의된 UI가 표시됩니다.

Screenshot shows a Note Entry on a mobile device.

NoteEntryPage 표시되면 뒤로 탐색이 해당 클래스의 NoteEntryPage 클래스를 AppNavigationControllerUIViewController 하여 사용자를 해당 클래스에 UIViewController 반환 NotesPage 합니다. 그러나 iOS 네이 UIViewController 티브 탐색 스택에서 팝하는 것은 연결된 개체를 UIViewControllerPage 자동으로 삭제하지 않습니다. 따라서 클래스는 AppNavigationController 메서드를 PopViewController 재정의하여 뒤로 탐색에서 뷰 컨트롤러를 삭제합니다.

public class AppNavigationController : UINavigationController
{
    //...
    public override UIViewController PopViewController(bool animated)
    {
        UIViewController topView = TopViewController;
        if (topView != null)
        {
            // Dispose of ViewController on back navigation.
            topView.Dispose();
        }
        return base.PopViewController(animated);
    }
}

재정의 DisposePopViewController iOS 네이티브 탐색 스택에서 팝된 개체의 메서드 UIViewController 를 호출합니다. 이 작업을 수행하지 않으면 연결된 개체와 연결된 Page 개체가 UIViewController 분리됩니다.

Important

분리된 개체는 가비지 수집할 수 없으므로 메모리 누수가 발생합니다.

Android

Android에서 클래스의 재정의 OnCreateMainActivity 는 일반적으로 애플리케이션 시작 관련 작업을 수행하는 위치입니다. 다음 코드 예제에서는 샘플 애플리케이션의 MainActivity 클래스를 보여줍니다.

public class MainActivity : AppCompatActivity
{
    public static string FolderPath { get; private set; }

    public static MainActivity Instance;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        Forms.Init(this, bundle);

        // Create app-level resource dictionary.
        Xamarin.Forms.Application.Current = new Xamarin.Forms.Application();
        Xamarin.Forms.Application.Current.Resources = new MyDictionary();

        Instance = this;

        SetContentView(Resource.Layout.Main);
        var toolbar = FindViewById<Toolbar>(Resource.Id.toolbar);
        SetSupportActionBar(toolbar);
        SupportActionBar.Title = "Notes";

        FolderPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData));

        NotesPage notesPage = new NotesPage()
        {
            // Set the parent so that the app-level resource dictionary can be located.
            Parent = Xamarin.Forms.Application.Current
        };
        AndroidX.Fragment.App.Fragment notesPageFragment = notesPage.CreateSupportFragment(this);

        SupportFragmentManager
            .BeginTransaction()
            .Replace(Resource.Id.fragment_frame_layout, mainPage)
            .Commit();
        //...

        notesPage.Parent = null;
    }
    ...
}

OnCreate 메서드에서 수행하는 작업은 다음과 같습니다.

  • Xamarin.Forms 는 메서드를 호출하여 초기화됩니다 Forms.Init .
  • Xamarin.Forms.Application 개체가 만들어지고 애플리케이션 수준 리소스 사전이 XAML에 정의된 것으로 ResourceDictionary 설정됩니다.
  • 클래스에 MainActivity 대한 참조는 필드에 저장됩니다 staticInstance . 이는 다른 클래스가 클래스에 정의된 메서드를 호출하는 메커니즘을 MainActivity 제공하기 위한 것입니다.
  • 콘텐츠는 Activity 레이아웃 리소스에서 설정됩니다. 샘플 애플리케이션에서 레이아웃은 조각 컨테이너 역할을 하는 Toolbar, 및 FrameLayout 포함하는 것으로 구성됩니다LinearLayout.
  • 검색 Toolbar 되어 작업 표시줄 Activity로 설정되고 작업 표시줄 제목이 설정됩니다.
  • 속성은 FolderPath 메모 데이터가 저장될 디바이스의 경로로 초기화됩니다.
  • NotesPage XAML에 정의된 파생 페이지인 개체가 만들어Xamarin.FormsContentPage지고 해당 부모가 이전에 만든 Xamarin.Forms.Application 개체로 설정됩니다.
  • NotesPage 개체는 확장 메서드를 Fragment 사용하여 CreateSupportFragment 변환됩니다.
  • 클래스는 SupportFragmentManager 인스턴스를 for NotesPage 클래스로 대체하는 FrameLayout 트랜잭션을 Fragment 만들고 커밋합니다.
  • Parent 개체의 NotesPage 속성은 메모리 누수 방지를 null위해 설정됩니다.

조각에 대한 자세한 내용은 조각을 참조 하세요.

메서드가 OnCreate 실행되면 다음 스크린샷과 같이 클래스에 Xamarin.FormsNotesPage 정의된 UI가 표시됩니다.

Screenshot shows a Notes screen on a mobile device with a blue banner and colored note text.

Important

페이지의 속성이 개체로 설정된 경우 모든 ContentPage파생 페이지는 애플리케이션 수준에서 ResourceDictionary정의된 리소스를 Application 사용할 수 Parent 있습니다.

예를 들어 UI를 탭하여 +ButtonUI와 상호 작용하면 코드 숨김 실행에서 NotesPage 다음 이벤트 처리기가 발생합니다.

void OnNoteAddedClicked(object sender, EventArgs e)
{
    MainActivity.Instance.NavigateToNoteEntryPage(new Note());
}

staticMainActivity.Instance 필드를 사용하면 MainActivity.NavigateToNoteEntryPage 다음 코드 예제에 표시된 메서드를 호출할 수 있습니다.

public void NavigateToNoteEntryPage(Note note)
{
    NoteEntryPage noteEntryPage = new NoteEntryPage
    {
        BindingContext = note,
        // Set the parent so that the app-level resource dictionary can be located.
        Parent = Xamarin.Forms.Application.Current
    };

    AndroidX.Fragment.App.Fragment noteEntryFragment = noteEntryPage.CreateSupportFragment(this);
    SupportFragmentManager
        .BeginTransaction()
        .AddToBackStack(null)
        .Replace(Resource.Id.fragment_frame_layout, noteEntryFragment)
        .Commit();

    noteEntryPage.Parent = null;
}

메서드는 NavigateToNoteEntryPage -derived 페이지를 확장 메서드가 있는 Fragment 페이지로 CreateSupportFragment 변환Xamarin.FormsContentPage하고 조각 뒤로 스택에 추가합니다Fragment. 따라서 다음 스크린샷과 Xamarin.FormsNoteEntryPage 같이 정의된 UI가 표시됩니다.

Screenshot shows a Note Entry on a mobile device with a blue banner.

이 항목이 NoteEntryPage 표시되면 뒤로 화살표를 탭하면 조각 뒤 스택에서 해당 항목이 팝업 FragmentNoteEntryPage 되고, 사용자가 Fragment 클래스에 대해 NotesPage 반환됩니다.

뒤로 탐색 지원 사용

클래스에는 SupportFragmentManagerBackStackChanged 조각 뒤로 스택의 내용이 변경 될 때마다 발생 하는 이벤트가 있습니다. 클래스의 MainActivity 메서드는 이 OnCreate 이벤트에 대한 익명 이벤트 처리기를 포함합니다.

SupportFragmentManager.BackStackChanged += (sender, e) =>
{
    bool hasBack = SupportFragmentManager.BackStackEntryCount > 0;
    SupportActionBar.SetHomeButtonEnabled(hasBack);
    SupportActionBar.SetDisplayHomeAsUpEnabled(hasBack);
    SupportActionBar.Title = hasBack ? "Note Entry" : "Notes";
};

이 이벤트 처리기는 조각 뒤로 스택에 하나 이상의 Fragment 인스턴스가 있는 경우 작업 표시줄에 뒤로 단추를 표시합니다. 뒤로 단추를 탭하는 응답은 재정의에 OnOptionsItemSelected 의해 처리됩니다.

public override bool OnOptionsItemSelected(Android.Views.IMenuItem item)
{
    if (item.ItemId == global::Android.Resource.Id.Home && SupportFragmentManager.BackStackEntryCount > 0)
    {
        SupportFragmentManager.PopBackStack();
        return true;
    }
    return base.OnOptionsItemSelected(item);
}

재정의는 OnOptionsItemSelected 옵션 메뉴의 항목을 선택할 때마다 호출됩니다. 이 구현은 뒤로 단추가 선택되어 있고 조각 뒤로 스택에 하나 이상의 Fragment 인스턴스가 있는 경우 조각 뒤 스택에서 현재 조각을 팝합니다.

여러 활동

애플리케이션이 여러 활동 ContentPage으로 구성된 경우 파생된 페이지를 각 활동에 포함할 수 있습니다. 이 시나리오에서는 메서드를 Forms.Init 포함하는 Xamarin.FormsContentPage첫 번째 Activity 메서드의 재정의에서 OnCreate 만 호출해야 합니다. 그러나 다음과 같은 영향을 미칩니다.

  • Xamarin.Forms.Color.Accent 은 메서드를 호출 Forms.InitActivity 값에서 가져옵니다.
  • Xamarin.Forms.Application.Current 은 메서드를 호출 Forms.InitActivity 값과 연결됩니다.

파일 선택

ContentPageHTML "파일 선택" 단추를 지원해야 하는 -derived 페이지를 사용하는 WebView 경우 메서드를 재정의 ActivityOnActivityResult 해야 합니다.

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    ActivityResultCallbackRegistry.InvokeCallback(requestCode, resultCode, data);
}

UWP

UWP에서 네이티브 App 클래스는 일반적으로 애플리케이션 시작 관련 작업을 수행할 수 있는 위치입니다. Xamarin.Forms는 일반적으로 인수를 OnLaunched 메서드에 Xamarin.Forms 전달하기 위해 UWP 애플리케이션의 네이티브 App 클래스 재정의 LaunchActivatedEventArgsForms.Init 에서 초기화됩니다. 이러한 이유로 파생 페이지를 사용하는 Xamarin.FormsContentPage네이티브 UWP 애플리케이션은 메서드에서 App.OnLaunched 메서드를 가장 쉽게 호출할 Forms.Init 수 있습니다.

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    // ...
    Xamarin.Forms.Forms.Init(e);

    // Create app-level resource dictionary.
    Xamarin.Forms.Application.Current = new Xamarin.Forms.Application();
    Xamarin.Forms.Application.Current.Resources = new MyDictionary();

    // ...
}

또한 이 메서드는 애플리케이션에 OnLaunched 필요한 애플리케이션 수준 리소스 사전을 만들 수도 있습니다.

기본적으로 네이티브 App 클래스는 애플리케이션의 MainPage 첫 번째 페이지로 클래스를 시작합니다. 다음 코드 예제에서는 샘플 애플리케이션의 MainPage 클래스를 보여줍니다.

public sealed partial class MainPage : Page
{
    NotesPage notesPage;
    NoteEntryPage noteEntryPage;

    public static MainPage Instance;
    public static string FolderPath { get; private set; }

    public MainPage()
    {
        this.NavigationCacheMode = NavigationCacheMode.Enabled;
        Instance = this;
        FolderPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData));

        notesPage = new Notes.UWP.Views.NotesPage
        {
            // Set the parent so that the app-level resource dictionary can be located.
            Parent = Xamarin.Forms.Application.Current
        };
        this.Content = notesPage.CreateFrameworkElement();
        // ...
        notesPage.Parent = null;    
    }
    // ...
}

MainPage 생성자는 다음 작업을 수행합니다.

  • 페이지에 대해 캐싱을 사용하도록 설정되므로 사용자가 페이지로 다시 이동할 때 새 MainPage 캐싱이 생성되지 않습니다.
  • 클래스에 MainPage 대한 참조는 필드에 저장됩니다 staticInstance . 이는 다른 클래스가 클래스에 정의된 메서드를 호출하는 메커니즘을 MainPage 제공하기 위한 것입니다.
  • 속성은 FolderPath 메모 데이터가 저장될 디바이스의 경로로 초기화됩니다.
  • NotesPage XAML에 정의된 파생 페이지인 개체가 만들어Xamarin.FormsContentPage지고 해당 부모가 이전에 만든 Xamarin.Forms.Application 개체로 설정됩니다.
  • 개체는 NotesPage using CreateFrameworkElement 확장 메서드로 FrameworkElement 변환된 다음 클래스의 MainPage 콘텐츠로 설정됩니다.
  • Parent 개체의 NotesPage 속성은 메모리 누수 방지를 null위해 설정됩니다.

MainPage 생성자가 실행되면 다음 스크린샷과 같이 클래스에 Xamarin.FormsNotesPage 정의된 UI가 표시됩니다.

Screenshot shows a Notes page with notes and date/times.

Important

페이지의 속성이 개체로 설정된 경우 모든 ContentPage파생 페이지는 애플리케이션 수준에서 ResourceDictionary정의된 리소스를 Application 사용할 수 Parent 있습니다.

예를 들어 UI를 탭하여 +ButtonUI와 상호 작용하면 코드 숨김 실행에서 NotesPage 다음 이벤트 처리기가 발생합니다.

void OnNoteAddedClicked(object sender, EventArgs e)
{
    MainPage.Instance.NavigateToNoteEntryPage(new Note());
}

staticMainPage.Instance 필드를 사용하면 MainPage.NavigateToNoteEntryPage 다음 코드 예제에 표시된 메서드를 호출할 수 있습니다.

public void NavigateToNoteEntryPage(Note note)
{
    noteEntryPage = new Notes.UWP.Views.NoteEntryPage
    {
        BindingContext = note,
        // Set the parent so that the app-level resource dictionary can be located.
        Parent = Xamarin.Forms.Application.Current
    };
    this.Frame.Navigate(noteEntryPage);
    noteEntryPage.Parent = null;
}

UWP의 탐색은 일반적으로 인수를 Frame.Navigate 사용하는 메서드를 사용하여 Page 수행됩니다. Xamarin.Forms 는 Frame.Navigate -derived 페이지 인스턴스를 사용하는 확장 메서드를 ContentPage정의합니다. 따라서 메서드가 NavigateToNoteEntryPage 실행되면 다음 스크린샷과 Xamarin.FormsNoteEntryPage 같이 정의된 UI가 표시됩니다.

Screenshot shows a Notes page with a text box with a note entered.

이 항목이 NoteEntryPage 표시되면 뒤로 화살표를 탭하면 앱 내 백 스택에서 해당 항목이 팝업 FrameworkElementNoteEntryPage 되고, 사용자가 FrameworkElement 클래스에 대해 NotesPage 반환됩니다.

페이지 크기 조정 지원 사용

UWP 애플리케이션 창의 크기가 조정되면 콘텐츠 크기 Xamarin.Forms 도 조정되어야 합니다. 이 작업은 생성자에서 MainPage 이벤트에 대한 Loaded 이벤트 처리기를 등록하여 수행됩니다.

public MainPage()
{
    // ...
    this.Loaded += OnMainPageLoaded;
    // ...
}

Loaded 이벤트는 페이지가 배치되고, 렌더링되고, 상호 작용할 준비가 되면 발생하며, 이에 대한 응답으로 메서드를 OnMainPageLoaded 실행합니다.

void OnMainPageLoaded(object sender, RoutedEventArgs e)
{
    this.Frame.SizeChanged += (o, args) =>
    {
        if (noteEntryPage != null)
            noteEntryPage.Layout(new Xamarin.Forms.Rectangle(0, 0, args.NewSize.Width, args.NewSize.Height));
        else
            notesPage.Layout(new Xamarin.Forms.Rectangle(0, 0, args.NewSize.Width, args.NewSize.Height));
    };
}

메서드는 OnMainPageLoaded 이벤트에 대한 Frame.SizeChanged 익명 이벤트 처리기를 등록합니다. 이 처리기는 속성이 ActualWidth 변경Frame될 때 ActualHeight 발생합니다. 이에 대한 응답으로 Xamarin.Forms 활성 페이지의 콘텐츠는 메서드를 호출하여 크기가 조정됩니다 Layout .

뒤로 탐색 지원 사용

UWP에서 애플리케이션은 다양한 디바이스 폼 팩터에서 모든 하드웨어 및 소프트웨어 뒤로 단추에 대해 뒤로 탐색을 사용하도록 설정해야 합니다. 이 작업은 생성자에서 MainPage 수행할 수 있는 이벤트에 대한 BackRequested 이벤트 처리기를 등록하여 수행할 수 있습니다.

public MainPage()
{
    // ...
    SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
}

애플리케이션이 시작 GetForCurrentView 되면 메서드는 현재 뷰와 연결된 개체를 검색 SystemNavigationManager 한 다음 이벤트에 대한 BackRequested 이벤트 처리기를 등록합니다. 애플리케이션은 포그라운드 애플리케이션인 경우에만 이 이벤트를 수신하고, 이에 대한 응답으로 이벤트 처리기를 호출 OnBackRequested 합니다.

void OnBackRequested(object sender, BackRequestedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame.CanGoBack)
    {
        e.Handled = true;
        rootFrame.GoBack();
        noteEntryPage = null;
    }
}

OnBackRequested 이벤트 처리기는 애플리케이션의 루트 프레임에서 메서드를 호출 GoBack 하고 이벤트를 처리된 것으로 표시하도록 true 속성을 설정합니다BackRequestedEventArgs.Handled. 이벤트를 처리된 것으로 표시하지 않으면 이벤트가 무시될 수 있습니다.

애플리케이션은 제목 표시줄에 뒤로 단추를 표시할지 여부를 선택합니다. 이 작업은 클래스에서 AppViewBackButtonVisibility 속성을 열거형 값 AppAppViewBackButtonVisibility 하나로 설정하여 수행됩니다.

void OnNavigated(object sender, NavigationEventArgs e)
{
    SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
        ((Frame)sender).CanGoBack ? AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;
}

OnNavigated 이벤트 발생에 대한 응답으로 Navigated 실행되는 이벤트 처리기는 페이지 탐색이 발생할 때 제목 표시줄 뒤로 단추의 표시 유형을 업데이트합니다. 이렇게 하면 앱 내 뒤로 스택이 비어 있지 않은 경우 제목 표시줄 뒤로 단추가 표시되거나 앱 내 뒤로 스택이 비어 있는 경우 제목 표시줄에서 제거됩니다.

UWP의 뒤로 탐색 지원에 대한 자세한 내용은 UWP 앱에 대한 탐색 기록 및 뒤로 탐색을 참조 하세요.