WPF 및 Xamarin.Forms 앱 수명 주기

Xamarin.Forms는 이전에 제공된 XAML 기반 프레임워크, 특히 WPF에서 많은 디자인 지침을 사용합니다. 그러나 다른 방법으로는 마이그레이션을 시도하는 사람들에게 고정 지점이 될 수 있는 상당한 편차가 있습니다. 이 문서에서는 이러한 문제 중 일부를 식별하고 가능한 경우 WPF 지식을 Xamarin.Forms에 연결하는 지침을 제공합니다.

앱 수명 주기

WPF와 Xamarin.Forms 간의 애플리케이션 수명 주기는 비슷합니다. 둘 다 외부(플랫폼) 코드에서 시작하고 메서드 호출을 통해 UI를 시작합니다. 차이점은 Xamarin.Forms는 항상 플랫폼별 어셈블리에서 시작한 다음, 앱에 대한 UI를 초기화하고 만든다는 것입니다.

WPF

  • Main method > App > MainWindow

참고 항목

메서드는 Main 기본적으로 자동으로 생성되며 코드에 표시되지 않습니다.

Xamarin.Forms

  • iOSMain method > AppDelegate > App > ContentPage
  • AndroidMainActivity > App > ContentPage
  • UWPMain method > App(UWP) > MainPage(UWP) > App > ContentPage

Application 클래스

WPF와 Xamarin.Forms 모두 Application 싱글톤으로 만들어지는 클래스가 있습니다. 대부분의 경우 앱은 WPF에서 엄격하게 필요하지는 않지만 사용자 지정 애플리케이션을 제공하기 위해 이 클래스에서 파생됩니다. 둘 다 생성된 싱글톤을 찾기 위해 속성을 노출 Application.Current 합니다.

전역 속성 + 지속성

WPF 및 Xamarin.Forms에는 Application.Properties 애플리케이션의 어디에서나 액세스할 수 있는 전역 앱 수준 개체를 저장할 수 있는 사전이 있습니다. 주요 차이점은 Xamarin.Forms는 앱이 일시 중단될 때 컬렉션에 저장된 모든 기본 형식을 유지 하며 다시 시작될 때 다시 로드한다는 것입니다. WPF는 해당 동작을 자동으로 지원하지 않습니다. 대신 대부분의 개발자는 격리된 스토리지에 의존하거나 기본 제공 Settings 지원을 활용했습니다.

페이지 및 시각적 트리 정의

WPF는 Window 최상위 시각적 요소의 루트 요소로 사용합니다. 이는 Windows 세계에서 정보를 표시하는 HWND를 정의합니다. WPF에서 원하는 만큼 창을 동시에 만들고 표시할 수 있습니다.

Xamarin.Forms에서 최상위 시각적 개체는 항상 플랫폼에 의해 정의됩니다(예: iOS의 경우 UIWindow). Xamarin.Forms는 클래스를 사용하여 Page 콘텐츠를 이러한 네이티브 플랫폼 표현으로 렌더링합니다. Xamarin.Forms의 각 Page 항목은 애플리케이션에서 한 번에 하나만 표시되는 고유한 "페이지"를 나타냅니다.

WF와 Window Xamarin.Forms Page 모두 표시된 제목에 영향을 주는 속성을 포함 Title 하며, 둘 다 Icon 페이지에 대한 특정 아이콘을 표시하는 속성이 있습니다(제목과 아이콘이 Xamarin.Forms에 항상 표시되는 것은 아님). 또한 배경색 또는 이미지와 같은 둘 다에서 일반적인 시각적 속성을 변경할 수 있습니다.

기술적으로 두 개의 개별 플랫폼 보기(예: 두 개체 UIWindow 를 정의하고 두 번째 개체를 외부 디스플레이 또는 AirPlay에 렌더링)로 렌더링할 수 있습니다. 이렇게 하려면 플랫폼별 코드가 필요하며 Xamarin.Forms 자체에서 직접 지원되는 기능은 아닙니다.

두 프레임워크의 시각적 계층 구조는 비슷합니다. WPF는 WYSIWYG 문서에 대한 지원으로 인해 조금 더 깊습니다.

WPF

DependencyObject - base class for all bindable things
   Visual - rendering mechanics
      UIElement - common events + interactions
         FrameworkElement - adds layout
            Shape - 2D graphics
            Control - interactive controls

Xamarin.Forms

BindableObject - base class for all bindable things
   Element - basic parent/child support + resources + effects
      VisualElement - adds visual rendering properties (color, fonts, transforms, etc.)
         View - layout + gesture support

뷰 수명 주기

Xamarin.Forms는 주로 모바일 시나리오를 중심으로 합니다. 따라서 애플리케이션은 사용자가 상호 작용할 때 활성화, 일시 중단다시 활성화 됩니다. 이는 WPF 애플리케이션에서 Window 멀리 클릭하는 것과 유사하며 이 동작을 모니터링하기 위해 재정의하거나 후크할 수 있는 메서드 및 해당 이벤트 집합이 있습니다.

목적 WPF 메서드 Xamarin.Forms 메서드
초기 활성화 ctor + Window.OnLoaded ctor + Page.OnStart
0개 항목 중 Window.IsVisibleChanged Page.Appearing
숨겨져 있음 Window.IsVisibleChanged Page.Disappearing
포커스 일시 중단/손실 Window.OnDeactivated Page.OnSleep
활성화됨/포커스가 있는 경우 Window.OnActivated Page.OnResume
닫힘 Window.OnClosing + Window.OnClosed 해당 없음

둘 다 자식 컨트롤 숨기기/표시도 지원합니다. WPF에서는 트라이 스테이트 속성 IsVisible (표시, 숨김 및 축소됨)입니다. Xamarin.Forms에서는 속성을 통해 표시되거나 숨겨집니다 IsVisible .

Layout

페이지 레이아웃은 WPF에서 발생하는 동일한 2단계(측정값/정렬)에서 발생합니다. Xamarin.Forms Page 클래스에서 다음 메서드를 재정의하여 페이지 레이아웃에 연결할 수 있습니다.

메서드 목적
OnChildMeasureInvalidated 자식의 기본 크기가 변경되었습니다.
OnSizeAllocated 페이지에 너비/높이가 할당되었습니다.
LayoutChanged 이벤트 페이지의 레이아웃/크기가 변경되었습니다.

현재 호출되는 전역 레이아웃 이벤트는 없으며 WPF에서 발견되는 것과 같은 전역 CompositionTarget.Rendering 이벤트도 없습니다.

일반적인 레이아웃 속성

WPF 및 Xamarin.Forms는 요소 주위의 간격을 제어하고 Padding 요소 내의 간격을 제어하도록 지원 Margin 합니다. 또한 대부분의 Xamarin.Forms 레이아웃 보기에는 간격을 제어하는 속성(예: 행 또는 열)이 있습니다.

또한 대부분의 요소에는 부모 컨테이너에 배치되는 방식에 영향을 주는 속성이 있습니다.

WPF Xamarin.Forms 목적
HorizontalAlignment HorizontalOptions 왼쪽/가운데/오른쪽/스트레치 옵션
VerticalAlignment VerticalOptions 위쪽/가운데/아래쪽/스트레치 옵션

참고 항목

이러한 속성의 실제 해석은 부모 컨테이너에 따라 달라집니다.

레이아웃 보기

WPF 및 Xamarin.Forms는 모두 레이아웃 컨트롤을 사용하여 자식 요소를 배치합니다. 대부분의 경우 이러한 기능은 기능 측면에서 서로 매우 가깝습니다.

WPF Xamarin.Forms 레이아웃 스타일
StackPanel StackLayout 왼쪽에서 오른쪽 또는 위쪽에서 아래쪽 무한 스택
그리드 그리드 테이블 형식(행 및 열)
DockPanel 해당 없음 창 가장자리에 도킹
캔버스 AbsoluteLayout 픽셀/좌표 위치 지정
WrapPanel 해당 없음 래핑 스택
해당 없음 RelativeLayout 상대 규칙 기반 위치 지정

참고 항목

Xamarin.Forms는 .를 GridSplitter지원하지 않습니다.

두 플랫폼 모두 연결된 속성을 사용하여 자식을 미세 조정합니다.

렌더링

WPF 및 Xamarin.Forms의 렌더링 메커니즘은 근본적으로 다릅니다. WPF에서 만드는 컨트롤은 화면의 픽셀에 콘텐츠를 직접 렌더링합니다. WPF는 기본이를 나타내는 두 개의 개체 그래프(트리)를 포함합니다. 논리 트리는 코드 또는 XAML에 정의된 컨트롤을 나타내며, 시각적 트리는 시각적 요소(가상 그리기 메서드를 통해) 또는 XAML 정의 ControlTemplate 에서 직접 수행되는 화면에서 발생하는 실제 렌더링을 나타냅니다. 일반적으로 시각적 트리는 컨트롤 주위의 테두리, 암시적 콘텐츠에 대한 레이블 등의 항목을 포함하므로 더 복잡합니다. WPF에는 이러한 두 개체 그래프를 검사하기 위한 API 집합(LogicalTreeHelperVisualTreeHelper)이 포함됩니다.

Xamarin.Forms에서 정의 Page 한 컨트롤은 단순한 데이터 개체일 뿐입니다. 논리 트리 표현과 유사하지만 자체 콘텐츠는 렌더링하지 않습니다. 대신 요소 렌더링에 영향을 주는 데이터 모델 입니다. 실제 렌더링은 각 컨트롤 형식매핑되는 별도의 시각적 렌더러 집합에 의해 수행됩니다. 이러한 렌더러는 플랫폼별 Xamarin.Forms 어셈블리에 의해 각 플랫폼별 프로젝트에 등록됩니다. 여기에서 목록을 볼 수 있습니다. Xamarin.Forms는 렌더러를 대체하거나 확장하는 것 외에도 플랫폼별로 네이티브 렌더링에 영향을 주는 데 사용할 수 있는 효과를 지원합니다.

논리/시각적 트리

Xamarin.Forms에서 논리 트리를 걸을 수 있는 노출된 API는 없지만 리플렉션을 사용하여 동일한 정보를 가져올 수 있습니다. 예를 들어 다음은 리플렉션을 사용하여 논리 자 식을 열거할 수 있는 메서드입니다.

그래픽

Xamarin.Forms에는 셰이프라고 하는 기본 형식을 그리기 위한 그래픽 시스템이 포함되어 있습니다. 셰이프에 대한 자세한 내용은 Xamarin.Forms 셰이프를 참조 하세요. 또한 SkiaSharp와 같은 타사 라이브러리를 포함하여 플랫폼 간 2D 드로잉을 가져올 수 있습니다.

리소스

WPF 및 Xamarin.Forms에는 모두 리소스 및 리소스 사전의 개념이 있습니다. 키와 함께 개체 형식을 ResourceDictionary 배치한 다음 변경되지 않는 항목 또는 {DynamicResource} 런타임 시 사전에서 변경될 수 있는 항목을 찾아볼 {StaticResource} 수 있습니다. 사용법과 메커니즘은 한 가지 차이점과 동일합니다. Xamarin.Forms는 속성에 할당할 Resources 대상을 정의 ResourceDictionary 해야 하는 반면 WPF는 속성을 미리 만들고 할당해야 합니다.

예를 들어 아래 정의를 참조하세요.

WPF

<Window.Resources>
   <Color x:Key="redColor">#ff0000</Color>
   ...
</Window.Resources>

Xamarin.Forms

<ContentPage.Resources>
   <ResourceDictionary>
      <Color x:Key="redColor">#ff0000</Color>
      ...
   </ResourceDictionary>
</ContentPage.Resources>

정의 ResourceDictionary하지 않으면 런타임 오류가 생성됩니다.

스타일

스타일은 Xamarin.Forms에서도 완벽하게 지원되며 UI를 구성하는 Xamarin.Forms 요소의 테마를 지정하는 데 사용할 수 있습니다. 트리거(속성, 이벤트 및 데이터), 상속을 통한 BasedOn상속 및 값에 대한 리소스 조회를 지원합니다. 스타일은 속성을 통해 Style 명시적으로 또는 WPF처럼 리소스 키를 제공하지 않음으로써 암시적으로 요소에 적용됩니다.

디바이스 스타일

WPF에는 시스템 색, 글꼴 및 메트릭을 값 및 리소스 키 형식으로 지시하는 미리 정의된 속성 집합(예: 정적 클래스 집합에 정적 값으로 SystemColors저장됨)이 있습니다. Xamarin.Forms는 유사하지만 동일한 항목을 나타내는 디바이스 스타일 집합을 정의합니다. 이러한 스타일은 프레임워크에서 제공되며 런타임 환경(예: 접근성)에 따라 값으로 설정됩니다.

WPF

<Label Text="Title" Foreground="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" />

Xamarin.Forms

<Label Text="Title" Style="{DynamicResource TitleStyle}" />