WPF vs. Жизненный цикл приложения Xamarin.FormsWPF vs. Xamarin.Forms App Lifecycle

Руководство по проектированию из платформы на основе XAML, полученные до нее, особенно WPF значительно Xamarin.Forms.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.Forms.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.Forms.The application lifecycle between WPF and Xamarin.Forms is similar. Как запустить в коде external (платформы) и запустить пользовательский Интерфейс посредством вызова метода.Both start in external (platform) code and launch the UI through a method call. Разница заключается в том, что Xamarin.Forms всегда начинается в сборке платформы, который затем инициализирует и создает пользовательский Интерфейс для приложения.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.Forms 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.Forms имеют 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.Forms сохранения любые типы-примитивы, хранящихся в коллекции, когда приложение приостановлено и загружает их повторно, когда он будет запущен повторно.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 как корневой элемент для любого элемента верхнего уровня visual.WPF uses the Window as the root element for any top-level visual element. Это определяет HWND в мире Windows для отображения информации.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.Forms, визуальный элемент верхнего уровня всегда определяется платформой — например на iOS, это UIWindow.In Xamarin.Forms, the top-level visual is always defined by the platform - for example on iOS, it's a UIWindow. Xamarin.Forms отрисовывает его содержимого в этими двумя представлениями собственной платформы с помощью Page класса.Xamarin.Forms renders it's content into these native platform representations using a Page class. Каждый Page в Xamarin.Forms представляет уникальный «страница» в приложении, где только один имеет видимой за раз.Each Page in Xamarin.Forms represents a unique "page" in the application, where only one is visible at a time.

Оба WPFs Window и Xamarin.Forms Page включают Title свойства, которые влияют на отображаемый заголовок и оба имеют Icon свойство для отображения указанного значка для страницы (Примечание , Заголовок и значок не всегда отображаются в Xamarin.Forms).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 объектов и иметь второго отрисовки для внешнего дисплея или AirPlay), он требует от платформы код для этого и не непосредственно поддерживаемой функцией Xamarin.Forms сам.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.Forms в первую очередь ориентирован на сценариев для мобильных устройств.Xamarin.Forms is primarily oriented around mobile scenarios. Таким образом, приложения, активации, приостановлено, и повторной активации как пользователь взаимодействует с ними.As such, applications are activated, suspended, and reactivated as the user interacts with them. Это похоже на щелчок мышью от Window в приложении WPF и существует набор методов и соответствующих событий, можно переопределить или отладочному для наблюдения за это поведение.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 Метод WPFWPF Method Метод Xamarin.FormsXamarin.Forms Method
Первоначальная активацияInitial activation ctor + Window.OnLoadedctor + Window.OnLoaded ctor + Page.OnStartctor + Page.OnStart
ПоказаноShown Window.IsVisibleChangedWindow.IsVisibleChanged Page.AppearingPage.Appearing
HiddenHidden Window.IsVisibleChangedWindow.IsVisibleChanged Page.DisappearingPage.Disappearing
Приостановить поражение фокусSuspend/Lost focus Window.OnDeactivatedWindow.OnDeactivated Page.OnSleepPage.OnSleep
Активировать фактическое фокусActivated/Got focus Window.OnActivatedWindow.OnActivated Page.OnResumePage.OnResume
ClosedClosed Window.OnClosing + Window.OnClosedWindow.OnClosing + Window.OnClosed Н/Дn/a

Поддержки как скрытие/отображение дочерних элементов управления, в WPF это свойство тремя состояниями IsVisible (видимым, скрытый и свернутый).Both support hiding/showing child controls as well, in WPF it's a tri-state property IsVisible (visible, hidden, and collapsed). В Xamarin.Forms, это просто видимым или скрытым с помощью IsVisible свойство.In Xamarin.Forms, it's just visible or hidden through the IsVisible property.

МакетLayout

Макет страницы происходит в том же 2-проходе (мер/расположение) происходящее в WPF.Page layout occurs in the same 2-pass (Measure/Arrange) that happens in WPF. Можно связать с макета страницы путем переопределения следующие методы в Xamarin.Forms 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.
OnSizeAllocatedOnSizeAllocated Страница, явно назначенной ширины и высоты.Page has been assigned a width/height.
События LayoutChanged представленияLayoutChanged event Макет и размер страницы был изменен.Layout/size of the Page has changed.

Существует событие не глобального макета, который вызывается в настоящее время не существует глобальной CompositionTarget.Rendering найти это событие как в WPF.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.Forms, поддерживают Margin интервала управления вокруг элемента, и Padding интервала управления внутри элемент.WPF and Xamarin.Forms both support Margin to control spacing around an element, and Padding to control spacing inside an element. Кроме того большая часть макета представления Xamarin.Forms имеют свойства для расстояния (например, строки или столбца).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 Параметры влево/Center/вправо/StretchLeft/Center/Right/Stretch options
VerticalAlignmentVerticalAlignment VerticalOptionsVerticalOptions Параметры TOP/Center/нижней/StretchTop/Center/Bottom/Stretch options

Примечание

Фактический интерпретации этих свойств зависит от родительского контейнера.The actual interpretation of these properties depends on the parent container.

Представления с макетомLayout views

WPF и Xamarin.Forms использовать элементы управления макета для размещения дочерних элементов.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
GridGrid GridGrid Табличном формате (строки и столбцы)Tabular format (rows and columns)
DockPanelDockPanel Н/Дn/a Закрепить края окнаDock to edges of window
CanvasCanvas AbsoluteLayoutAbsoluteLayout Позиционирование пикселя с координатойPixel/Coordinate positioning
WrapPanelWrapPanel Н/Дn/a Упаковки стекаWrapping stack
Н/Дn/a RelativeLayoutRelativeLayout Относительный основе правил позиционированияRelative rule-based positioning

Примечание

Xamarin.Forms поддерживает GridSplitter.Xamarin.Forms does not support a GridSplitter.

Обе эти платформы используют присоединенных свойств для точной настройки дочерних элементов.Both platforms use attached properties to fine-tune children.

ОтрисовкаRendering

Механизм отрисовки для WPF и Xamarin.Forms радикально отличаются.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 и визуального дерева представляет Реальное отображение, происходящее на экране, который является выполнения любого непосредственно с помощью визуального элемента (с помощью метода виртуального draw), или с помощью определяемых 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 (LogicalTreeHelper и VisualTreeHelper) для таких ошибок два объекта диаграммы.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.Forms, элементы управления определяются в 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. Реальное отображение осуществляется разделения набор visual модулей подготовки отчетов которой сопоставляются с каждого типа элемента управления.The actual rendering is done by a separate set of visual renderers which are mapped to each control type. Эти модули подготовки отчетов регистрируются в каждом из проектов с платформой Xamarin.Forms сборки для конкретных платформ.These renderers are registered in each of the platform-specific projects by platform-specific Xamarin.Forms assemblies. Вы увидите список здесь.You can see a list here. В дополнение к замена или расширение модуль подготовки отчетов, Xamarin.Forms также реализована поддержка эффекты которого может использоваться для изменения собственного отрисовку в каждой платформы.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.

Дерево логических/VisualThe Logical/Visual Tree

Никакой интерфейс API, предоставляемых для выполнения логического дерева, описанной в Xamarin.Forms — но можно использовать отражение для получения те же сведения.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.Forms не включает графической системе примитивов за пределы простого прямоугольника (BoxView).Xamarin.Forms does not include a graphics system for primitives beyond a simple rectangle (BoxView). Может включать библиотеки сторонних производителей, таких как SkiaSharp для получения кросс платформенных двухмерного рисования, или UrhoSharp для 3D.You can include 3rd party libraries such as SkiaSharp to get cross-platform 2D drawing, or UrhoSharp for 3D.

РесурсыResources

WPF и Xamarin.Forms имеют концепцию ресурсы и словари ресурсов.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.Forms требуется определить ResourceDictionary присваиваемое Resources свойство, тогда как 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.Forms и можно использовать тему 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.Forms, похоже, но также определяет набор стили устройства для представления и то же.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}" />