WPF 및 Xamarin.Forms: 유사성 및 차이점

컨트롤 템플릿

WPF는 컨트롤(ButtonListBox등)에 대한 시각화 지침을 제공하는 컨트롤 템플릿개념을 지원합니다. 위에서 멘션 것처럼 Xamarin.Forms는 네이티브 플랫폼(iOS, Android 등)과 상호 작용하여 컨트롤을 시각화하는 구체적인 렌더링 클래스를 사용합니다.

그러나 Xamarin.Forms 에는ControlTemplate 테마 개체에 Page 사용되는 형식이 있습니다. 일관된 콘텐츠를 제공하지만 페이지 사용자가 색, 글꼴 등을 변경하고 요소를 추가하여 애플리케이션에 고유하게 만들 수 있는 정의를 Page 제공합니다.

이에 대한 일반적인 사용법은 인증 대화 상자, 프롬프트 및 앱 내에서 사용자 지정할 수 있는 표준화되었지만 테마가 있는 페이지 모양과 느낌을 제공하는 것입니다. 이 지원의 일부로 친숙한 WPF 명명된 컨트롤이 많이 사용됩니다.

  1. ContentPage
  2. ContentView
  3. ContentPresenter
  4. TemplateBinding

그러나 이러한 항목이 Xamarin.Forms에서 동일한 용도로 작동하지 않는다는 것을 아는 것이 중요합니다. 이 기능에 대한 자세한 내용은 설명서 페이지를 검사.

XAML

XAML은 WPF 및 Xamarin.Forms에 대한 선언적 태그 언어로 사용됩니다. 대부분의 경우 구문은 동일합니다. 주요 차이점은 XAML 그래프에서 정의/만든 개체입니다.

  • Xamarin.Forms는 XAML 2009 사양을 지원합니다. 이렇게 하면 제네릭 형식을 정의하고 생성자에 인수를 전달할 뿐만 아니라 s, ints 등과 같은 string데이터를 더 쉽게 정의할 수 있습니다.

  • 현재 WPF에서 사용할 수 있는 것처럼 XAML을 동적으로 로드할 수 XamlReader있는 방법은 없습니다. 하지만 NuGet 패키지동일한 기본 기능을 가져올 수 있습니다.

태그 확장

Xamarin.Forms는 WPF와 마찬가지로 태그 확장을 통해 XAML 확장을 지원합니다. 기본적으로 다음과 같은 기본 구성 요소가 있습니다.

  1. {x:Array}
  2. {Binding}
  3. {DynamicResource}
  4. {x:Null}
  5. {x:Static}
  6. {StaticResource}
  7. {x:Type}

또한 XAML 2009 사양 및 {TemplateBinding} Xamarin.Forms에서 지원하는 특수 버전 ControlTemplate 에 사용되는 태그 확장이 포함 {x:Reference} 됩니다.

Warning

ControlTemplate 동일한 이름을 가지고 있더라도 지원은 동일하지 않습니다.

Xamarin.Forms는 사용자 지정 태그 확장도 지원하지만 구현은 약간 다릅니다. WPF에서는 추상 기본 클래스에서 MarkupExtension 파생해야 합니다. Xamarin.Forms에서 인터페이스 IMarkupExtension 로 대체되거나 IMarkupExtension<T> 더 유연합니다.

WPF와 마찬가지로 필요한 단일 메서드는 태그 확장에서 값을 반환하는 메서드입니다 ProvideValue .

바인딩 인프라

핵심 개념 중 하나는 시각적 속성을 .NET 데이터 속성에 연결하는 데이터 바인딩 인프라입니다. 이를 통해 MVVM과 같은 아키텍처 패턴을 사용할 수 있습니다. 기본 디자인은 동일합니다. 바인딩 가능한 기본 클래스 BindableObject가 있으며 WPF에서는 DependencyObject 클래스입니다. 이 기본 클래스는 데이터 바인딩에 대상으로 참여할 모든 개체에 대한 루트 상위 항목으로 사용됩니다. 그런 다음 파생 클래스는 속성 값의 백업 스토리지 역할을 하는 BindableProperty 개체를 노출합니다(WPF에서 DependencyProperty 개체로 정의됨).

바인딩할 수 있는 속성 정의

Xamarin.Forms의 바인딩 가능한 속성에 대한 정의는 WPF와 동일합니다.

  1. 개체는 .에서 BindableObject파생되어야 합니다.
  2. 속성에 대한 백업 스토리지 키를 정의하기 위해 선언된 형식 BindableProperty 의 공용 정적 필드가 있어야 합니다.
  3. 속성 값을 사용하고 GetValue 검색하고 SetValue 변경하는 공용 인스턴스 속성 래퍼가 있어야 합니다.

전체 예제는 Xamarin.Forms의 바인딩 가능한 속성을 참조 하세요.

연결된 속성

연결된 속성은 바인딩 가능한 속성의 하위 집합이며 WPF에서와 동일한 방식으로 작동합니다. 주요 차이점은 이 경우 속성 래퍼를 생략하고 소유 클래스의 정적 get/set 메서드 집합으로 대체된다는 것입니다. 자세한 내용은 Xamarin.Forms의 연결된 속성을 참조하세요.

바인딩 엔진 사용

바인딩 엔진을 사용하는 프로세스는 WPF와 동일합니다. 소스 개체(모든 .NET 형식)와 선택적 속성 값에 연결된 개체를 만들어 Binding 코드 숨김에서 활용할 수 있습니다(생략하면 WPF와 마찬가지로 원본 개체를 속성 자체로 처리). 그런 다음 모든 항목을 사용하여 SetBinding 바인딩을 에 연결할 수 있습니다BindableProperty.BindableObject

또는 을 사용하여 XAML에서 바인딩 관계를 정의할 BindingExtension수 있습니다. WPF의 확장과 동일한 기본 값이 있습니다.

바인딩 지원 및 엔진은 WPF보다 Silverlight 구현과 더 유사합니다. Xamarin.Forms에서 구현되지 않은 몇 가지 누락된 기능이 있습니다.

  • 바인딩에는 다음 기능이 지원되지 않습니다.
    • BindingGroupName
    • BindsDirectlyToSource
    • Isasync
    • MultiBinding
    • NotifyOnSourceUpdated
    • NotifyOnTargetUpdated
    • NotifyOnValidationError
    • UpdateSourceTrigger
    • UpdateSourceExceptionFilter
    • ValidatesOnDataErrors
    • ValidatesOnExceptions
    • ValidationRules 컬렉션
    • XPath
    • XmlNamespaceManager

RelativeSource

바인딩에 대한 RelativeSource 지원은 없습니다. WPF에서 XAML에 정의된 다른 시각적 요소에 바인딩할 수 있습니다. Xamarin.Forms에서 태그 확장을 사용하여 {x:Reference} 동일한 기능을 달성할 수 있습니다. 예를 들어 Text 속성이 있는 이름이 "otherControl"인 컨트롤이 있다고 가정하면 다음과 같이 바인딩할 수 있습니다.

WPF

Text={Binding RelativeSource={RelativeSource otherControl}, Path=Text}

Xamarin.Forms

Text={Binding Source={x:Reference otherControl}, Path=Text}

기능에 동일한 기능을 사용할 {RelativeSource Self} 수 있습니다. 그러나 형식({RelativeSource FindAncestor})으로 상위 항목 찾기는 지원되지 않습니다.

바인딩 컨텍스트

WPF에서 기본 바인딩 원본을 DataContext 다시 나타내는 속성 값을 정의할 수 있습니다. 바인딩의 원본이 정의되지 않은 경우 이 속성 값이 사용됩니다. 값은 시각적 트리 아래로 상속되므로 더 높은 수준에서 정의한 다음 자식에서 사용할 수 있습니다.

Xamarin.Forms에서 이 동일한 기능은 사용할 수 있지만 속성 이름은 다음과 같습니다 BindingContext.

값 변환기

값 변환기는 WPF와 마찬가지로 Xamarin.Forms에서 완전히 지원됩니다. 동일한 인터페이스 셰이프가 사용되지만 Xamarin.Forms에는 네임스페이스에 정의된 인터페이스가 Xamarin.Forms 있습니다.

Model-View-ViewModel

MVVM은 WPF와 Xamarin.Forms 모두에서 완전히 지원됩니다.

WPF에는 때때로 사용되는 기본 제공 RoutedCommand 이 포함되어 있습니다. Xamarin.Forms에는 인터페이스 정의 이외의 ICommand 기본 제공 명령 지원이 없습니다. MVVM을 구현하는 데 필요한 기본 클래스를 추가하는 다양한 MVVM 프레임워크를 포함할 수 있습니다.

INotifyPropertyChanged 및 INotifyCollectionChanged

두 인터페이스 모두 Xamarin.Forms 바인딩에서 완전히 지원됩니다. 많은 XAML 기반 프레임워크와 달리, WPF와 마찬가지로 Xamarin.Forms의 백그라운드 스레드에서 속성 변경 알림을 발생시킬 수 있으며 바인딩 엔진은 UI 스레드로 제대로 전환됩니다.

또한 두 환경 모두 적절한 스레드 마샬링을 지원하고 SynchronizationContextasync/await 수행합니다. WPF는 모든 시각적 요소에 클래스를 포함하고 Dispatcher , Xamarin.Forms에는 사용할 수 있는 정적 메서드 Device.BeginInvokeOnMainThread 가 있습니다(플랫폼 간 코딩에 선호됨 SynchronizationContext ).

  • Xamarin.Forms에는 컬렉션 변경 알림을 지원하는 기능이 포함되어 ObservableCollection<T> 있습니다.
  • 컬렉션에 대해 스레드 간 업데이트를 사용하도록 설정하는 데 사용할 BindingBase.EnableCollectionSynchronization 수 있습니다. API는 사용량 세부 정보에 대한 문서를 검사 WPF 변형과 약간 다릅니다.

데이터 템플릿

데이터 템플릿은 행(셀)의 렌더링을 사용자 지정하기 위해 Xamarin.Forms에서 ListView 지원됩니다. 콘텐츠 지향 컨트롤에 s를 활용할 DataTemplate수 있는 WPF와 달리 Xamarin.Forms는 현재 해당 ListView컨트롤만 사용합니다. 템플릿 정의는 인라인(속성에 ItemTemplate 할당됨) 또는 에 있는 리소스 ResourceDictionary로 정의할 수 있습니다.

또한 WPF에 대응하는 만큼 유연하지는 않습니다.

  1. 루트 요소는 DataTemplate 항상 개체여야 합니다.ViewCell
  2. 데이터 트리거는 데이터 템플릿에서 완전히 지원되지만 트리거가 연결된 속성의 형식을 나타내는 속성을 포함 DataType 해야 합니다.
  3. DataTemplateSelector 는 지원되지만 파생 DataTemplate 되므로 속성에 직접 ItemTemplate 할당됩니다(WPF와 비교 ItemTemplateSelector ).

ItemsControl

Xamarin.Forms에 해당하는 ItemsControl 기본 제공 기능은 없지만 여기에서 사용할 수 있는 Xamarin.Forms에 대한 사용자 지정 항목이 있습니다.

사용자 컨트롤

WPF UserControl에서 s는 연결된 동작이 있는 UI 섹션을 제공하는 데 사용됩니다. Xamarin.Forms에서는 동일한 용도로 ContentView 사용합니다. XAML에서 바인딩 및 포함을 모두 지원합니다.

WPF에는 "브라우저와 유사한" 탐색 기능을 제공하는 데 사용할 수 있는 거의 사용되지 NavigationService 않는 항목이 포함되어 있습니다. 그러나 대부분의 앱은 이 문제를 신경 쓰지 않았고 대신 다른 Window 요소 또는 창의 다른 섹션을 사용하여 데이터를 표시했습니다.

휴대폰 디바이스에서는 종종 다른 화면 이 솔루션이므로 Xamarin.Forms에는 다음과 같은 여러 가지 형태의 탐색이 지원됩니다.

탐색 스타일 페이지 유형
스택 기반(푸시/팝) NavigationPage
마스터/세부 정보 MasterDetailPage
TabbedPage
왼쪽/오른쪽으로 살짝 밀기 CarouselView

가장 NavigationPage 일반적인 접근 방식이며 모든 페이지에는 Navigation 탐색 스택에서 페이지를 푸시하거나 팝하는 데 사용할 수 있는 속성이 있습니다. 이는 WPF에서 찾은 NavigationService 것과 가장 가깝습니다.

URL 탐색

WPF는 데스크톱 기반 기술이며 명령줄 매개 변수를 수락하여 시작 동작을 직접 수행할 수 있습니다. Xamarin.Forms는 딥 URL 연결을 사용하여 시작할 때 페이지로 이동할 수 있습니다.