WPF 및 Xamarin.ios 앱 수명 주기WPF vs. Xamarin.Forms App Lifecycle

Xamarin.ios는 특히 WPF 이전에 제공 된 XAML 기반 프레임 워크에서 많은 디자인 지침을 사용 합니다.Xamarin.Forms takes a lot of design guidance from the XAML-based frameworks that came before it, particularly WPF. 그러나 다른 방법으로는 마이그레이션을 시도 하는 사용자에 대 한 고정 지점이 될 수 있습니다.However, in other ways it deviates significantly which can be a sticky point for people attempting to migrate over. 이 문서에서는 이러한 문제 중 일부를 식별 하 고 가능한 경우 WPF 정보를 Xamarin.ios에 연결할 수 있는 지침을 제공 합니다.This document attempts to identify some of those issues and provide guidance where possible to bridge WPF knowledge to Xamarin.Forms.

앱 수명 주기App Lifecycle

WPF와 Xamarin.ios 간의 응용 프로그램 수명 주기는 비슷합니다.The application lifecycle between WPF and Xamarin.Forms is similar. 모두 외부 (플랫폼) 코드에서 시작 하 고 메서드 호출을 통해 UI를 시작 합니다.Both start in external (platform) code and launch the UI through a method call. 차이점은 Xamarin.ios는 항상 플랫폼별 어셈블리에서 시작 하 여 앱에 대 한 UI를 초기화 하 고 만드는 것입니다.The difference is that Xamarin.Forms always starts in a platform-specific assembly which then initializes and creates the UI for the app.

WPFWPF

  • Main method > App > MainWindow

참고

Main 메서드는 기본적으로 자동 생성 되며 코드에 표시 되지 않습니다.The Main method is, by default, auto generated and not visible in the code.

Xamarin.FormsXamarin.Forms

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

응용 프로그램 클래스Application class

WPF와 Xamarin.ios 모두 단일 항목으로 만들어지는 Application 클래스가 있습니다.Both WPF and Xamarin.Forms have an Application class which is created as a singleton. 대부분의 경우 앱은이 클래스에서 파생 되므로 사용자 지정 응용 프로그램을 제공 하는 것은 WPF에서 반드시 필요한 것은 아니지만 이러한 응용 프로그램을 제공 합니다.In most cases, apps will derive from this class to provide a custom application, although this is not strictly required in WPF. 둘 다 Application.Current 속성을 노출 하 여 생성 된 단일 항목을 찾습니다.Both expose an Application.Current property to locate the created singleton.

전역 속성 + 지 속성Global properties + persistence

WPF와 Xamarin.ios에는 모두 응용 프로그램의 어디에서 나 액세스할 수 있는 전역 앱 수준 개체를 저장할 수 있는 Application.Properties 사전이 있습니다.Both WPF and Xamarin.Forms have a Application.Properties dictionary available where you can store global app-level objects that are accessible anywhere in the application. 주요 차이점은 Xamarin.ios가 앱이 일시 중단 될 때 컬렉션에 저장 된 모든 기본 형식을 유지 하 고 고 때 다시 로드 한다는 것입니다.The key difference is that Xamarin.Forms will persist any primitive types stored in the collection when the app is suspended, and reload them when it is relaunched. WPF는 이러한 동작을 자동으로 지원 하지 않습니다. 대부분의 개발자는 격리 된 저장소에 의존 하거나 기본 제공 되는 Settings 지원을 활용 했습니다.WPF does not automatically support that behavior - instead, most developers relied on isolated storage, or utilized the built-in Settings support.

페이지 및 시각적 트리 정의Defining pages and the Visual Tree

WPF는 Window을 최상위 시각적 요소의 루트 요소로 사용 합니다.WPF uses the Window as the root element for any top-level visual element. 이는 정보를 표시 하기 위해 Windows 환경의 HWND를 정의 합니다.This defines an HWND in the Windows world to display information. WPF에서 원하는 만큼 창을 동시에 만들고 표시할 수 있습니다.You can create and display as many windows simultaneously as you like in WPF.

Xamarin.ios에서 최상위 시각적 개체는 항상 플랫폼에 의해 정의 됩니다. 예를 들어 iOS의 UIWindow입니다.In Xamarin.Forms, the top-level visual is always defined by the platform - for example on iOS, it's a UIWindow. Xamarin.ios는 Page 클래스를 사용 하 여 해당 콘텐츠를 이러한 네이티브 플랫폼 표현으로 렌더링 합니다.Xamarin.Forms renders it's content into these native platform representations using a Page class. Xamarin.ios의 각 Page는 응용 프로그램에서 한 번에 하나만 표시 되는 고유한 "페이지"를 나타냅니다.Each Page in Xamarin.Forms represents a unique "page" in the application, where only one is visible at a time.

WPFs Window 및 Xamarin.ios Page에는 표시 된 제목에 영향을 주는 Title 속성이 포함 되어 있으며, 두 속성 모두 페이지에 대 한 특정 아이콘을 표시 하는 Icon 속성이 있습니다 .이 경우 제목과 아이콘은 항상 xamarin.ios에 표시 되지 않습니다. ).Both WPFs Window and Xamarin.Forms Page include a Title property to influence the displayed title, and both have an Icon property to display a specific icon for the page (Note that the title and icon are not always visible in Xamarin.Forms). 또한 배경색 또는 이미지와 같은 일반적인 시각적 속성을 변경할 수 있습니다.In addition, you can change common visual properties on both such as the background color or image.

기술적으로는 두 개의 서로 다른 플랫폼 뷰로 렌더링 (예: 두 개의 UIWindow 개체를 정의 하 고 두 번째 개체는 외부 디스플레이 또는 방송 재생으로 렌더링) 할 수 있습니다 .이 작업을 수행 하려면 플랫폼별 코드가 필요 합니다. Xamarin 양식 자체.It is technically possible to render to two separate platform views (e.g. define two UIWindow objects and have the second one render to an external display or AirPlay), it requires platform-specific code to do so and is not a directly supported feature of Xamarin.Forms itself.

보기Views

두 프레임 워크의 시각적 계층 구조는 유사 합니다.The visual hierarchy for both frameworks is similar. WPF는 WYSIWYG 문서에 대 한 지원으로 인해 조금 더 자세히 설명 합니다.WPF is a bit deeper due to its support for WYSIWYG documents.

WPFWPF

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

Xamarin.FormsXamarin.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

뷰 수명 주기View Lifecycle

Xamarin.ios는 주로 모바일 시나리오를 중심으로 합니다.Xamarin.Forms is primarily oriented around mobile scenarios. 따라서 응용 프로그램은 사용자가 상호 작용할 때 활성화, _일시 중단_및 다시 활성화 됩니다.As such, applications are activated, suspended, and reactivated as the user interacts with them. 이는 WPF 응용 프로그램에서 Window를 클릭 하는 것과 유사 하며,이 동작을 모니터링 하기 위해 재정의 하거나 후크 할 수 있는 메서드 및 해당 이벤트 집합이 있습니다.This is similar to clicking away from the Window in a WPF application and there are a set of methods and corresponding events you can override or hook into to monitor this behavior.

용도Purpose WPF 메서드WPF Method Xamarin.ios 메서드Xamarin.Forms Method
초기 활성화Initial activation ctor + OnLoadedctor + Window.OnLoaded ctor + 페이지. OnStartctor + Page.OnStart
같이Shown IsVisibleChangedWindow.IsVisibleChanged 페이지. 표시Page.Appearing
HiddenHidden IsVisibleChangedWindow.IsVisibleChanged 페이지. 사라짐Page.Disappearing
일시 중단/포커스 손실Suspend/Lost focus 창. OnDeactivated 됨Window.OnDeactivated 페이지. OnSleepPage.OnSleep
활성화/포커스를 가져왔습니다.Activated/Got focus 창. OnActivated 됨Window.OnActivated 페이지. OnResumePage.OnResume
종결됨Closed 창. OnClosing + 창. OnclosingWindow.OnClosing + Window.OnClosed N/An/a

두 가지 모두 자식 컨트롤을 숨기 거 나 표시 하는 기능을 지원 합니다. WPF에서는 세 가지 상태 속성 IsVisible (visible, hidden 및 축소)입니다.Both support hiding/showing child controls as well, in WPF it's a tri-state property IsVisible (visible, hidden, and collapsed). Xamarin.ios에서는 IsVisible 속성을 통해서만 표시 하거나 숨길 수 있습니다.In Xamarin.Forms, it's just visible or hidden through the IsVisible property.

레이아웃Layout

페이지 레이아웃은 WPF에서 발생 하는 동일한 2 패스 (측정/정렬)에서 발생 합니다.Page layout occurs in the same 2-pass (Measure/Arrange) that happens in WPF. Xamarin.ios Page 클래스에서 다음 메서드를 재정의 하 여 페이지 레이아웃에 연결할 수 있습니다.You can hook into the page layout by overriding the following methods in the Xamarin.Forms Page class:

메서드Method 용도Purpose
OnChildMeasureInvalidatedOnChildMeasureInvalidated 자식의 기본 설정 크기가 변경 되었습니다.Preferred size of a child has changed.
OnSizeAllocated 됨OnSizeAllocated 페이지에 너비/높이가 할당 되었습니다.Page has been assigned a width/height.
LayoutChanged 이벤트LayoutChanged event 페이지의 레이아웃/크기가 변경 되었습니다.Layout/size of the Page has changed.

현재 호출 되는 전역 레이아웃 이벤트가 없고 WPF에서와 같은 전역 CompositionTarget.Rendering 이벤트도 없습니다.There is no global layout event which is called today, nor is there a global CompositionTarget.Rendering event like found in WPF.

공통 레이아웃 속성Common layout properties

WPF 및 Xamarin.ios는 모두 요소 주위의 간격을 제어 하는 Margin을 지원 하 고 요소 내부의 간격을 제어 Padding 합니다.WPF and Xamarin.Forms both support Margin to control spacing around an element, and Padding to control spacing inside an element. 또한 대부분의 Xamarin.ios 레이아웃 보기에는 간격 (예: 행 또는 열)을 제어 하는 속성이 있습니다.In addition, most of the Xamarin.Forms layout views have properties to control spacing (e.g. row or column).

또한 대부분의 요소에는 부모 컨테이너에 배치 되는 방법에 영향을 주는 속성이 있습니다.In addition, most elements have properties to influence how they are positioned in the parent container:

WPFWPF Xamarin.FormsXamarin.Forms 용도Purpose
HorizontalAlignmentHorizontalAlignment HorizontalOptionsHorizontalOptions 왼쪽/가운데/오른쪽/늘이기 옵션Left/Center/Right/Stretch options
VerticalAlignmentVerticalAlignment VerticalOptionsVerticalOptions 위쪽/가운데/아래쪽/늘이기 옵션Top/Center/Bottom/Stretch options

참고

이러한 속성의 실제 해석은 부모 컨테이너에 따라 다릅니다.The actual interpretation of these properties depends on the parent container.

레이아웃 뷰Layout views

WPF 및 Xamarin.ios는 모두 레이아웃 컨트롤을 사용 하 여 자식 요소를 배치 합니다.WPF and Xamarin.Forms both use layout controls to position child elements. 대부분의 경우 이러한 기능은 기능 측면에서 서로 매우 가깝습니다.In most cases, these are very close to each other in terms of functionality.

WPFWPF Xamarin.FormsXamarin.Forms 레이아웃 스타일Layout Style
StackPanelStackPanel StackLayoutStackLayout 왼쪽에서 오른쪽 또는 위쪽에서 아래쪽 무한 누적Left-to-right, or top-to-bottom infinite stacking
Grid Grid 테이블 형식 (행 및 열)Tabular format (rows and columns)
DockPanelDockPanel N/An/a 창의 가장자리에 도킹Dock to edges of window
CanvasCanvas AbsoluteLayoutAbsoluteLayout 픽셀/좌표 위치 지정Pixel/Coordinate positioning
WrapPanelWrapPanel N/An/a 줄 바꿈 스택Wrapping stack
N/An/a RelativeLayoutRelativeLayout 상대 규칙 기반 위치 지정Relative rule-based positioning

참고

Xamarin.ios는 GridSplitter을 지원 하지 않습니다.Xamarin.Forms does not support a GridSplitter.

두 플랫폼 모두 연결 된 속성 을 사용 하 여 자식 항목을 미세 조정 합니다.Both platforms use attached properties to fine-tune children.

렌더링Rendering

WPF 및 Xamarin.ios의 렌더링 메커니즘은 완전히 다릅니다.The rendering mechanics for WPF and Xamarin.Forms are radically different. WPF에서 직접 만든 컨트롤은 화면에서 콘텐츠를 픽셀에 직접 렌더링 합니다.In WPF, the controls you create directly render content to pixels on the screen. WPF는이를 나타내기 위해 두 개의 개체 그래프 (트리)를 유지 관리 합니다. 논리 트리 는 코드 또는 XAML에 정의 된 컨트롤을 나타내고 시각적 트리 는 수행 되는 화면에서 발생 하는 실제 렌더링을 나타냅니다. 시각적 요소 (가상 그리기 메서드를 통해) 또는 바꾸거나 사용자 지정할 수 있는 XAML 정의 ControlTemplate를 통해 직접.WPF maintains two object graphs (trees) to represent this - the logical tree represents the controls as defined in code or XAML, and the visual tree represents the actual rendering that occurs on the screen which is performed either directly by the visual element (through a virtual draw method), or through a XAML-defined ControlTemplate which can be replaced or customized. 일반적으로 시각적 트리는 컨트롤 주위에 테두리, 암시적 내용의 레이블 등을 비롯 하 여 더 복잡 합니다. WPF에는 이러한 두 개체 그래프를 검사 하는 Api (LogicalTreeHelperVisualTreeHelper) 집합이 포함 되어 있습니다.Typically, the visual tree is more complex as it includes things such as borders around controls, labels for implicit content, etc. WPF includes a set of APIs (LogicalTreeHelper and VisualTreeHelper) to examine these two object graphs.

Xamarin.ios에서 Page에 정의 하는 컨트롤은 단순히 단순 데이터 개체입니다.In Xamarin.Forms, the controls you define in a Page are really just simple data objects. 논리적 트리 표현과 비슷하지만 콘텐츠를 자체적으로 렌더링 하지 않습니다.They are similar to the logical tree representation, but never render content on their own. 대신 요소 렌더링에 영향을 주는 데이터 모델 입니다.Instead, they are the data model which influences the rendering of elements. 실제 렌더링은 각 컨트롤 형식에 매핑되는 개별 시각적 렌더러 집합에 의해 수행 됩니다.The actual rendering is done by a separate set of visual renderers which are mapped to each control type. 이러한 렌더러는 플랫폼별 Xamarin.ios 어셈블리에서 각 플랫폼별 프로젝트에 등록 됩니다.These renderers are registered in each of the platform-specific projects by platform-specific Xamarin.Forms assemblies. 여기에서 목록을 볼 수 있습니다.You can see a list here. Xamarin.ios는 렌더러를 교체 하거나 확장 하는 것 외에도 플랫폼 단위로 네이티브 렌더링에 영향을 주는 데 사용할 수 있는 효과 를 지원 합니다.In addition to replacing or extending the renderer, Xamarin.Forms also has support for Effects which can be used to influence the native rendering on a per-platform basis.

논리적/시각적 트리The Logical/Visual Tree

Xamarin.ios에서 논리적 트리를 탐색 하기 위한 API는 제공 되지 않지만 리플렉션을 사용 하 여 동일한 정보를 얻을 수 있습니다.There is no exposed API to walk the logical tree in Xamarin.Forms - but you can use Reflection to get the same information. 예를 들어 다음은 리플렉션을 사용 하 여 논리적 자식을 열거할 수 있는 메서드입니다 .For example, here's a method which can enumerate logical children with reflection.

그래픽Graphics

Xamarin.ios에는 단순 사각형 (BoxView)을 초과 하는 기본 형식의 그래픽 시스템이 포함 되지 않습니다.Xamarin.Forms does not include a graphics system for primitives beyond a simple rectangle (BoxView). SkiaSharp 등의 타사 라이브러리를 포함 하 여 플랫폼 간 2d 그리기 또는 3D 용 urhosharp 를 가져올 수 있습니다.You can include 3rd party libraries such as SkiaSharp to get cross-platform 2D drawing, or UrhoSharp for 3D.

자료Resources

WPF 및 Xamarin.ios에는 모두 리소스와 리소스 사전의 개념이 있습니다.WPF and Xamarin.Forms both have the concept of resources and resource dictionaries. 키를 사용 하 여 ResourceDictionary에 모든 개체 유형을 배치한 다음 변경 되지 않는 항목에 대 한 {StaticResource}를 조회 하거나 런타임에 사전에서 변경 될 수 있는 항목에 대해 {DynamicResource} 수 있습니다.You can place any object type into a ResourceDictionary with a key and then look it up with {StaticResource} for things which will not change, or {DynamicResource} for things which can change in the dictionary at runtime. 사용 및 메커니즘은 한 가지 차이점이 있습니다. 예를 들어 Xamarin.ios는 Resources 속성에 할당할 ResourceDictionary를 정의 하는 반면 WPF는이를 미리 만들고 사용자에 게 할당 해야 합니다.The usage and mechanics are the same with one difference: Xamarin.Forms requires that you define the ResourceDictionary to assign to the Resources property whereas WPF pre-creates one and assigns it for you.

예를 들어 아래 정의를 참조 하세요.For example, see the definition below:

WPFWPF

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

Xamarin.FormsXamarin.Forms

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

ResourceDictionary를 정의 하지 않으면 런타임 오류가 발생 합니다.If you do not define the ResourceDictionary, a runtime error is generated.

스타일Styles

스타일은 Xamarin.ios 에서도 완전히 지원 되며 UI를 구성 하는 Xamarin. Forms 요소에 테마를 지정 하는 데 사용할 수 있습니다.Styles are also fully supported in Xamarin.Forms and can be used to theme the Xamarin.Forms elements that make up the UI. 트리거 (속성, 이벤트 및 데이터), BasedOn통한 상속 및 값에 대 한 리소스 조회를 지원 합니다.They support triggers (property, event and data), inheritance through BasedOn, and resource lookups for values. 스타일은 Style 속성을 통해 명시적으로 또는 WPF와 마찬가지로 리소스 키를 제공 하지 않고 암시적으로 요소에 적용 됩니다.Styles are applied to elements either explicitly through the Style property, or implicitly by not supplying a resource key - just like WPF.

디바이스 스타일Device Styles

WPF에는 시스템 색, 글꼴 및 메트릭을 값 및 리소스 키 형식으로 지시 하는 미리 정의 된 속성 집합 (SystemColors와 같은 정적 클래스 집합에 정적 값으로 저장 됨)이 있습니다.WPF has a set of predefined properties (stored as static values on a set of static classes such as SystemColors) which dictate system colors, fonts and metrics in the form of values and resource keys. Xamarin.ios는 유사 하지만 동일한 작업을 나타내는 장치 스타일 집합을 정의 합니다.Xamarin.Forms is similar, but defines a set of Device Styles to represent the same things. 이러한 스타일은 프레임 워크에서 제공 하 고 런타임 환경 (예: 액세스 가능성)을 기반으로 하는 값으로 설정 됩니다.These styles are supplied by the framework and set to values based on the runtime environment (e.g. accessibility).

WPFWPF

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

Xamarin.FormsXamarin.Forms

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