WPF 및 Xamarin.ios: 유사성 & 차이점WPF vs. Xamarin.Forms: Similarities & Differences

컨트롤 템플릿Control Templates

WPF는 컨트롤에 대 한 시각화 명령 (Button, ListBox 등)을 제공 하는 컨트롤 템플릿의 개념을 지원 합니다.WPF supports the concept of Control Templates which provide the visualization instructions for a control (Button, ListBox, etc.). 위에서 설명한 것 처럼 Xamarin.ios는 네이티브 플랫폼 (iOS, Android 등)과 상호 작용 하 여 컨트롤을 시각화 하는 구체적인 렌더링 클래스를 사용 합니다.As mentioned above, Xamarin.Forms uses concrete rendering classes for this which interact with the native platform (iOS, Android, etc.) to visualize the control.

그러나 Xamarin.ios에는 ControlTemplate 형식이 있습니다. Page 개체에 테마를 사용 하는 데 사용 됩니다.However, Xamarin.Forms does have a ControlTemplate type - it is used for theming Page objects. 일관 된 콘텐츠를 제공 하는 Page에 대 한 정의를 제공 하지만 페이지 사용자가 색, 글꼴 등을 변경할 수 있도록 하 고, 요소를 추가 하 여 응용 프로그램에 고유 하 게 만들 수도 있습니다.It provides a definition for a Page that provides consistent content, but allows the user of the page to change colors, fonts, etc. and even add elements to make it unique to the application.

이에 대 한 일반적인 용도는 인증 대화 상자, 프롬프트 및 표준화 된 기능을 제공 하는 것 이며 앱 내에서 사용자 지정할 수 있는 페이지 모양과 느낌을 제공 합니다.Common usages for this are things such as authentication dialogs, prompts and to provide a standardized, but themable page look and feel that can be customized within the app. 이 지원의 일부로 익숙한 WPF 이름 컨트롤을 많이 사용 합니다.As part of this support, many familiar WPF-named controls are used:

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

하지만 Xamarin.ios에서 동일한 용도를 제공 하지 않는다는 것을 알아야 합니다.But it's important to know that these are not serving the same purpose in Xamarin.Forms. 이 기능에 대 한 자세한 내용은 설명서 페이지를 참조 하세요.For more information on this feature, check out the documentation page.

XAMLXAML

XAML은 WPF 및 Xamarin.ios에 대 한 선언적 태그 언어로 사용 됩니다.XAML is used as the declarative markup language for WPF and Xamarin.Forms. 대부분의 경우 구문은 동일 합니다. 주요 차이점은 XAML 그래프에서 정의/만든 개체입니다.For the most part, the syntax is identical - the primary difference is the objects that are defined/created by the XAML graphs.

  • Xamarin.ios는 XAML 2009 사양을지원 합니다. 이렇게 하면 제네릭 형식을 정의 하 고 생성자에 인수를 전달 하는 것 외에도 strings, ints 등의 데이터를 보다 쉽게 정의할 수 있습니다.Xamarin.Forms supports the XAML 2009 specification; this makes it easier to define data such as strings, ints, etc. as well as defining generic types and passing arguments to constructors.

  • 현재 XamlReader에서 WPF와 같은 XAML을 동적으로 로드할 수 있는 방법은 없습니다.There is currently no way to dynamically load XAML like WPF can with XamlReader. 그러나 NuGet 패키지 를 사용 하 여 동일한 기본 기능을 얻을 수 있습니다.You can get the same basic functionality with a NuGet package though.

태그 확장Markup Extensions

Xamarin.ios는 WPF와 매우 유사한 태그 확장을 통해 XAML 확장을 지원 합니다.Xamarin.Forms supports extending XAML through markup extensions, much like WPF. 기본적으로 기본 구성 요소는 다음과 같습니다.Out of the box, it has the same basic building blocks:

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

또한이 클래스에는 XAML 2009 사양의 {x:Reference}와 Xamarin.ios에서 지원 되는 ControlTemplate의 특수 버전에 사용 되는 {TemplateBinding} 태그 확장이 포함 되어 있습니다.In addition, it includes {x:Reference} from the XAML 2009 specification, and a {TemplateBinding} markup extension which is used for the specialized version of ControlTemplate supported by Xamarin.Forms.

경고

동일한 이름을 가진 ControlTemplate 지원도 동일 하지 않습니다.The ControlTemplate support isn't the same - even though it has the same name.

Xamarin.ios는 사용자 지정 태그 확장도 지원 하지만 구현은 약간 다릅니다.Xamarin.Forms supports custom markup extensions as well - but the implementation is slightly different. WPF에서는 MarkupExtension-추상 기본 클래스에서 파생 해야 합니다.In WPF, you must derive from MarkupExtension - an abstract base class. Xamarin.ios에서 인터페이스 IMarkupExtension 또는 IMarkupExtension<T> 더 유동적입니다.In Xamarin.Forms, that is replaced with an interface IMarkupExtension or IMarkupExtension<T> which is more flexible.

WPF와 마찬가지로, 단일 필수 메서드는 태그 확장에서 값을 반환 하는 ProvideValue 메서드입니다.Just like WPF, the single required method is a ProvideValue method to return the value from the markup extension.

바인딩 인프라Binding infrastructure

핵심 개념 중 하나는 .NET 데이터 속성에 시각적 속성을 연결 하는 데이터 바인딩 인프라입니다.One of the core concepts carried over is a data binding infrastructure to connect visual properties to .NET data properties. 이를 통해 MVVM와 같은 아키텍처 패턴을 사용할 수 있습니다.This enables architectural patterns such as MVVM. 기본 디자인은 동일 합니다. 즉, 바인딩할 수 있는 기본 클래스 Bindableobject가 있습니다. WPF에서는 DependencyObject 클래스입니다.The basic design is identical - you have a bindable base class BindableObject, in WPF this is the DependencyObject class. 이 기본 클래스는 데이터 바인딩의 대상으로 참여 하는 모든 개체에 대 한 루트 상위 항목으로 사용 됩니다.This base class is used as the root ancestor for all objects that will participate as targets in data binding. 그런 다음 파생 된 클래스는 속성 값에 대 한 지원 저장소 역할을 하는 Bindableproperty 개체를 노출 합니다. 이러한 개체는 WPF에서 DependencyProperty 개체로 정의 됩니다.The derived classes then expose BindableProperty objects which act as the backing storage for property values (these are defined as DependencyProperty objects in WPF).

바인딩 가능한 속성 정의Defining bindable properties

Xamarin.ios의 바인딩 가능한 속성에 대 한 정의는 WPF와 동일 합니다.The definition for a bindable property in Xamarin.Forms is the same as WPF:

  1. 개체는 BindableObject에서 파생 되어야 합니다.The object must derive from BindableObject.
  2. 속성에 대 한 지원 저장소 키를 정의 하려면 선언 된 BindableProperty 형식의 공용 정적 필드가 있어야 합니다.There must be a public static field of type BindableProperty declared to define the backing storage key for the property.
  3. GetValueSetValue를 사용 하 여 속성 값을 검색 하 고 변경 하는 공용 인스턴스 속성 래퍼가 있어야 합니다.There should be a public instance property wrapper that uses GetValue and SetValue to retrieve and change the properties value.

전체 예제는 xamarin.ios의 바인딩 가능한 속성을 참조 하세요.For a complete example, see Bindable Properties in Xamarin.Forms.

연결 된 속성Attached properties

연결 된 속성은 바인딩 가능한 속성의 하위 집합이 며 WPF에서와 동일한 방식으로 작동 합니다.Attached properties are a subset of the bindable property and they work the same way they do in WPF. 주요 차이점은 속성 래퍼가이 사례에서 생략 소유 하는 클래스에 대 한 정적 get/set 메서드 집합으로 대체 된다는 것입니다.The primary difference is that the property wrapper is ommitted in this case and replaced with a set of static get/set methods on the owning class. 자세한 내용은 xamarin.ios의 연결 된 속성 을 참조 하세요.See Attached Properties in Xamarin.Forms for more information.

바인딩 엔진 사용Using the binding engine

바인딩 엔진을 사용 하는 프로세스는 WPF의 경우와 동일 합니다.The process for using the binding engine is the same as it is in WPF. 소스 개체에 연결 된 Binding 개체 (.NET 형식) 및 선택적 속성 값 (생략 경우 WPF 처럼 소스 개체를 속성 자체로 처리 하는 경우)을 만들어 코드 숨김으로 활용할 수 있습니다.It can be utilized in code-behind by creating a Binding object tied to a source object (any .NET type) and an optional property value (if ommitted, it treats the source object as the property itself - just like WPF). 그런 다음 BindableObject에 대 한 SetBinding를 사용 하 여 바인딩을 BindableProperty에 연결할 수 있습니다.You can then use SetBinding on any BindableObject to associate the binding to a BindableProperty.

또는 BindingExtension를 사용 하 여 XAML에서 바인딩 관계를 정의할 수 있습니다.Alternatively, you can define the binding relationship in XAML using the BindingExtension. WPF의 확장과 동일한 기본 값을 갖습니다.It has the same basic values as the extension in WPF.

바인딩 지원 및 엔진은 WPF 보다 Silverlight 구현과 더 유사 합니다.The binding support and engine are more similar to the Silverlight implementation than WPF. Xamarin에서 구현 되지 않은 몇 가지 기능이 없습니다.There are several missing features which were not implemented in Xamarin.Forms:

  • 바인딩에는 다음 기능이 지원 되지 않습니다.There is no support for the following features in bindings:
    • BindingGroupNameBindingGroupName
    • BindsDirectlyToSourceBindsDirectlyToSource
    • IsAsyncIsAsync
    • MultiBindingMultiBinding
    • NotifyOnSourceUpdatedNotifyOnSourceUpdated
    • NotifyOnTargetUpdatedNotifyOnTargetUpdated
    • NotifyOnValidationErrorNotifyOnValidationError
    • System.windows.data.binding.updatesourcetriggerUpdateSourceTrigger
    • UpdateSourceExceptionFilterUpdateSourceExceptionFilter
    • ValidatesOnDataErrorsValidatesOnDataErrors
    • ValidatesOnExceptionsValidatesOnExceptions
    • ValidationRules 컬렉션ValidationRules collection
    • XPath입니다.XPath
    • XmlNamespaceManagerXmlNamespaceManager

RelativeSourceRelativeSource

RelativeSource 바인딩이 지원 되지 않습니다.There is no support for RelativeSource bindings. WPF에서 XAML로 정의 된 다른 시각적 요소에 바인딩할 수 있습니다.In WPF, these allow you to bind to other visual elements defined in XAML. Xamarin.ios에서는 {x:Reference} 태그 확장을 사용 하 여이 기능을 구현할 수 있습니다.In Xamarin.Forms, this same capability can be achieved using the {x:Reference} markup extension. 예를 들어, 텍스트 속성을 포함 하는 "otherControl" 라는 컨트롤이 있는 경우 다음과 같이 바인딩할 수 있습니다.For example, assuming we have a control with the name "otherControl" that has a Text property, we can bind to it like this:

WPFWPF

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

Xamarin.FormsXamarin.Forms

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

동일한 기능을 {RelativeSource Self} 기능에 사용할 수 있습니다.The same capability can be used for the {RelativeSource Self} feature. 그러나 형식으로 상위 항목을 찾을 수 있는 경우 ({RelativeSource FindAncestor})는 지원 되지 않습니다.However there is no support for locating ancestors by type ({RelativeSource FindAncestor}).

바인딩 컨텍스트Binding context

WPF에서 기본 바인딩 소스를 다시 지정 하는 DataContext 속성 값을 정의할 수 있습니다.In WPF, you can define a DataContext property value which reprents the default binding source. 바인딩의 소스가 정의 되어 있지 않으면이 속성 값이 사용 됩니다.If the source for a binding is not defined, this property value is used. 값은 시각적 트리 아래로 상속 되므로 상위 수준에서 정의 된 다음 자식에서 사용할 수 있습니다.The value is inherited down the visual tree, allowing it to be defined at a higher level and then used by children.

Xamarin.ios에서이 기능은 사용 가능한 이지만 속성 이름은 BindingContext입니다.In Xamarin.Forms, this same feature is avaialable, but the property name is BindingContext.

값 변환기Value converters

값 변환기는 WPF와 마찬가지로 Xamarin.ios에서 완벽 하 게 지원 됩니다.Value converters are fully supported in Xamarin.Forms - just like WPF. 동일한 인터페이스 모양이 사용 되지만 Xamarin.ios는 Xamarin.Forms 네임 스페이스에 정의 된 인터페이스를 포함 합니다.The same interface shape is used, but Xamarin.Forms has the interface defined in the Xamarin.Forms namespace.

모델-뷰-ViewModelModel-View-ViewModel

MVVM는 WPF 및 Xamarin.ios에서 완전히 지원 됩니다.MVVM is completely supported by both WPF and Xamarin.Forms.

WPF에는 사용 되는 기본 제공 RoutedCommand이 포함 되어 있습니다. Xamarin.ios에는 ICommand 인터페이스 정의 외에도 기본 제공 되는 명령 지원이 없습니다.WPF includes a built in RoutedCommand which is sometimes used; Xamarin.Forms has no built-in commanding support beyond the ICommand interface definition. 다양 한 MVVM 프레임 워크를 포함 하 여 MVVM를 구현 하는 데 필요한 기본 클래스를 추가할 수 있습니다.You can include a variety of MVVM frameworks to add the necessary base classes to implement MVVM.

INotifyPropertyChanged 및 INotifyCollectionChangedINotifyPropertyChanged and INotifyCollectionChanged

두 인터페이스 모두 Xamarin. Forms 바인딩에서 완벽 하 게 지원 됩니다.Both interfaces are fully supported in Xamarin.Forms bindings. 많은 XAML 기반 프레임 워크와 달리, Xamarin.ios의 백그라운드 스레드에서 속성 변경 알림이 발생할 수 있으며 (예: WPF와 마찬가지로) 바인딩 엔진은 UI 스레드로 적절히 전환 됩니다.Unlike many XAML-based frameworks, property change notifications can be raised on background threads in Xamarin.Forms (just like WPF) and the binding engine will properly transition to the UI thread.

또한 두 환경 모두 SynchronziationContextasync / await를 지원 하 여 적절 한 스레드 마샬링을 수행 합니다.In addition, both environments support SynchronziationContext and async/await to do proper thread marshalling. WPF는 모든 시각적 요소에 Dispatcher 클래스를 포함 하며, Xamarin. Forms에는 사용할 수 있는 정적 메서드 Device.BeginInvokeOnMainThread 있습니다 (플랫폼 간 코딩에는 SynchronizationContext이 선호 됨).WPF includes the Dispatcher class on all visual elements, Xamarin.Forms has a static method Device.BeginInvokeOnMainThread which can also be used (although SynchronizationContext is preferred for cross-platform coding).

  • Xamarin.ios에는 컬렉션 변경 알림을 지 원하는 ObservableCollection<T> 포함 되어 있습니다.Xamarin.Forms includes an ObservableCollection<T> which supports collection change notifications.
  • BindingBase.EnableCollectionSynchronization를 사용 하 여 컬렉션에 대 한 크로스 스레드 업데이트를 사용 하도록 설정할 수 있습니다.You can use BindingBase.EnableCollectionSynchronization to enable cross-thread updates for a collection. API는 WPF 변형과 약간 다릅니다. 자세한 내용은 문서를 참조하세요.The API is slightly different from the WPF variation, check the docs for usage details.

데이터 템플릿Data Templates

데이터 템플릿은 ListView 행 (셀)의 렌더링을 사용자 지정 하기 위해 Xamarin.ios에서 지원 됩니다.Data templates are supported in Xamarin.Forms to customize the rendering of a ListView row (cell). 콘텐츠 기반 컨트롤에 대 한 DataTemplates를 활용할 수 있는 WPF와는 달리, Xamarin.ios는 현재 ListView에만 사용 합니다.Unlike WPF which can utilize DataTemplates for any content-oriented control, Xamarin.Forms currently only uses them for ListView. 템플릿 정의는 인라인으로 정의 (ItemTemplate 속성에 할당 됨) 하거나 ResourceDictionary의 리소스로 정의 될 수 있습니다.The template definition can be defined inline (assigned to the ItemTemplate property), or as a resource in a ResourceDictionary.

또한 WPF에 상응 하는 것 만큼 유연 하지 않습니다.In addition, they are not quite as flexible as their WPF counterpart.

  1. DataTemplate의 루트 요소는 항상 ViewCell 개체 여야 합니다.The root element of the DataTemplate must always be a ViewCell object.
  2. 데이터 트리거는 데이터 템플릿에서 완전히 지원 되지만 트리거와 연결 된 속성의 유형을 나타내는 DataType 속성을 포함 해야 합니다.Data Triggers are fully supported in a Data Template, but must include a DataType property indicating the type of the property that the trigger is associated with.
  3. DataTemplateSelector도 지원 되지만 DataTemplate에서 파생 되므로 ItemTemplate 속성 (vs)에 직접 할당 됩니다. WPF의 ItemTemplateSelector).DataTemplateSelector is also supported, but derives from DataTemplate and is therefore just assigned directly to the ItemTemplate property (vs. ItemTemplateSelector in WPF).

ItemsControlItemsControl

Xamarin.ios의 ItemsControl에는 기본 제공 되는 형식이 없습니다. 하지만 여기에서 사용할 수 있는 xamarin.ios에 대 한 사용자 지정이 있습니다.There is no built-in equivalent to an ItemsControl in Xamarin.Forms; but there is a custom one for Xamarin.Forms available here.

사용자 정의 컨트롤User Controls

WPF에서 UserControls는 연결 된 동작이 있는 UI 섹션을 제공 하는 데 사용 됩니다.In WPF, UserControls are used to provide a section of UI which has associated behavior. Xamarin.ios에서는 동일한 용도로 ContentView를 사용 합니다.In Xamarin.Forms, we use the ContentView for the same purpose. 둘 다 XAML에서 바인딩과 포함을 지원 합니다.Both support binding and inclusion in XAML.

WPF에는 "브라우저와 유사한" 탐색 기능을 제공 하는 데 사용할 수 있는 거의 사용 되지 않는 NavigationService 포함 되어 있습니다.WPF includes a rarely used NavigationService which could be used to provide a "browser-like" navigation feature. 대부분의 앱은이에 대 한 다른 Window 요소 또는 데이터를 표시 하는 창의 다른 섹션을 대신 사용 했습니다.Most apps didn't bother with this however and instead used different Window elements, or different sections of the window to display data.

전화 장치에서 다양 한 화면이 종종 솔루션 이므로 Xamarin. 양식에는 여러 가지 형태의 탐색 지원이 포함 됩니다.On phone devices, different screens are often the solution and so Xamarin.Forms includes support for several forms of navigation:

탐색 스타일Navigation Style 페이지 유형Page Type
스택 기반 (푸시/pop)Stack-based (push/pop) NavigationPageNavigationPage
마스터/세부 정보Master/Detail MasterDetailPageMasterDetailPage
Tabs TabbedPageTabbedPage
왼쪽/오른쪽으로 살짝 밀기Swipe Left/Right CarouselViewCarouselView

NavigationPage은 가장 일반적인 방법 이며 모든 페이지에는 탐색 스택에서 페이지를 밀거나 끄는 데 사용할 수 있는 Navigation 속성이 있습니다.The NavigationPage is the most common approach, and every page has a Navigation property which can be used to push or pop pages on and off the navigation stack. 이는 WPF에서 발견 된 NavigationService와 가장 유사한 기능입니다.This is the closest equivalent to the NavigationService found in WPF.

URL 탐색URL navigation

WPF는 데스크톱 지향 기술 이며, 명령줄 매개 변수를 허용 하 여 시작 동작을 직접 수행할 수 있습니다.WPF is a desktop-oriented technology and can accept command-line parameters to direct startup behavior. Xamarin.ios는 전체 URL 링크 를 사용 하 여 시작 시 페이지로 이동할 수 있습니다.Xamarin.Forms can use deep URL linking to jump to a page on startup.