Wpf frente al ciclo de vida de las aplicaciones de Xamarin.Forms
Xamarin.Forms toma una gran cantidad de instrucciones de diseño de los marcos basados en XAML anteriores, especialmente WPF. Sin embargo, de otras maneras se desvía significativamente, lo que puede ser un punto permanente para las personas que intentan migrar. En este documento se intenta identificar algunos de esos problemas y proporcionar instrucciones siempre que sea posible para enlazar los conocimientos de WPF a Xamarin.Forms.
Ciclo de vida de la aplicación
El ciclo de vida de la aplicación entre WPF y Xamarin.Forms es similar. Ambos se inician en código externo (plataforma) e inician la interfaz de usuario mediante una llamada al método . La diferencia es que Xamarin.Forms siempre se inicia en un ensamblado específico de la plataforma que, a continuación, inicializa y crea la interfaz de usuario para la aplicación.
WPF
Main method > App > MainWindow
Nota:
De Main forma predeterminada, el método se genera automáticamente y no es visible en el código.
Xamarin.Forms
- iOS:
- Android:
- UWP:
La clase Application
TANTO WPF como Xamarin.Forms tienen Application una clase que se crea como singleton. En la mayoría de los casos, las aplicaciones derivarán de esta clase para proporcionar una aplicación personalizada, aunque esto no es estrictamente necesario en WPF. Ambos exponen una Application.Current propiedad para buscar el singleton creado.
Propiedades globales + persistencia
TANTO WPF como Xamarin.Forms tienen un diccionario disponible donde puede almacenar objetos globales de nivel de aplicación a los que se puede acceder desde cualquier Application.Properties lugar de la aplicación. La diferencia clave es que Xamarin.Forms conservará los tipos primitivos almacenados en la colección cuando se suspenda la aplicación y los volverá a cargar cuando se vuelva a iniciar. WPF no admite automáticamente ese comportamiento; en su lugar, la mayoría de los desarrolladores se basaron en el almacenamiento aislado o usaron la compatibilidad Settings integrada.
Definir páginas y el árbol visual
WPF usa como Window elemento raíz para cualquier elemento visual de nivel superior. Esto define un HWND en el Windows para mostrar información. Puede crear y mostrar tantas ventanas simultáneamente como quiera en WPF.
En Xamarin.Forms, la plataforma siempre define el objeto visual de nivel superior; por ejemplo, en iOS, es UIWindow . Xamarin.Forms representa su contenido en estas representaciones de plataforma nativas mediante una Page clase . Cada Page de Xamarin.Forms representa una "página" única en la aplicación, donde solo se puede ver una a la vez.
Tanto WPF como Xamarin.Forms incluyen una propiedad para influir en el título mostrado y ambos tienen una propiedad para mostrar un icono específico para la página (tenga en cuenta que el título y el icono no siempre están visibles en WindowPageTitleIcon Xamarin.Forms).Window Además, puede cambiar las propiedades visuales comunes en ambos, como el color de fondo o la imagen.
Técnicamente es posible representar en dos vistas de plataforma independientes (por ejemplo, definir dos objetos y hacer que el segundo se represente en una pantalla externa o AirPlay), requiere código específico de la plataforma para hacerlo y no es una característica compatible directamente con UIWindow Xamarin.Forms.
Vistas
La jerarquía visual de ambos marcos es similar. WPF es un poco más profundo debido a su compatibilidad con documentos 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
Ciclo de vida de las vistas
Xamarin.Forms está orientado principalmente a escenarios móviles. Por lo tanto, las aplicaciones se activan,suspendeny se reactivan a medida que el usuario interactúa con ellas. Esto es similar a hacer clic fuera de en una aplicación WPF y hay un conjunto de métodos y eventos correspondientes en los que puede invalidar o enlazar para Window supervisar este comportamiento.
| Propósito | Wpf (método) | Xamarin.Forms (método) |
|---|---|---|
| Activación inicial | ctor + Window.OnLoaded | ctor + Page.OnStart |
| Mostrado | Window.IsVisibleChanged | Page.Appearing |
| Hidden | Window.IsVisibleChanged | Page.Disappearing |
| Suspender o perder el foco | Window.OnDeactivated | Page.OnSleep |
| Activated/Got focus | Window.OnActivated | Page.OnResume |
| Closed | Window.OnClosing + Window.OnClosed | N/D |
Ambos también admiten ocultar o mostrar controles secundarios, en WPF es una propiedad de tres estados IsVisible (visible, oculto y contraído). En Xamarin.Forms, solo es visible u oculto a través de la IsVisible propiedad .
Diseño
El diseño de página se produce en el mismo paso 2 (Measure/Arrange) que se produce en WPF. Puede enlazar con el diseño de página invalidando los métodos siguientes en la clase de Page Xamarin.Forms:
| Método | Propósito |
|---|---|
| OnChildMeasureInvalidated | Ha cambiado el tamaño preferido de un elemento secundario. |
| OnSizeAllocated | Se ha asignado un ancho o alto a la página. |
| Evento LayoutChanged | El diseño o el tamaño de la página han cambiado. |
No hay ningún evento de diseño global que se llame hoy en día, ni hay un evento global como CompositionTarget.Rendering el que se encuentra en WPF.
Propiedades de diseño comunes
TANTO WPF como Xamarin.Forms admiten controlar el espaciado alrededor de un elemento y el MarginPadding espaciado dentro Margin un elemento. Además, la mayoría de las vistas de diseño de Xamarin.Forms tienen propiedades para controlar el espaciado (por ejemplo, fila o columna).
Además, la mayoría de los elementos tienen propiedades para influir en cómo se posicionan en el contenedor primario:
| WPF | Xamarin.Forms | Propósito |
|---|---|---|
| HorizontalAlignment | HorizontalOptions | Opciones Izquierda,Centro/Derecha/Stretch |
| Verticalalignment | VerticalOptions | Opciones Superior/Centro/Inferior/Stretch |
Nota:
La interpretación real de estas propiedades depende del contenedor primario.
Vistas de diseño
WPF y Xamarin.Forms usan controles de diseño para colocar elementos secundarios. En la mayoría de los casos, están muy cerca unos de otros en términos de funcionalidad.
| WPF | Xamarin.Forms | Estilo de diseño |
|---|---|---|
| StackPanel | StackLayout | Apilamiento infinito de izquierda a derecha o de arriba a abajo |
| Cuadrícula | Cuadrícula | Formato tabular (filas y columnas) |
| DockPanel | N/D | Acoplar a los bordes de la ventana |
| Lienzo | AbsoluteLayout | Posición de píxeles y coordenadas |
| WrapPanel | N/D | Ajuste de la pila |
| N/D | RelativeLayout | Posición relativa basada en reglas |
Nota:
Xamarin.Forms no admite GridSplitter .
Ambas plataformas usan propiedades adjuntas para ajustar los secundarios.
Representación
La mecánica de representación para WPF y Xamarin.Forms es radicalmente diferente. En WPF, los controles que se crean representan directamente contenido en píxeles en la pantalla. WPF mantiene dos gráficos de objetos(árboles) para representarlo: el árbol lógico representa los controles definidos en código o XAML, y el árbol visual representa la representación real que se produce en la pantalla, que se realiza directamente mediante el elemento visual (a través de un método de dibujo virtual) o a través de un elemento definido por XAML que se puede reemplazar o personalizar. Normalmente, el árbol visual es más complejo, ya que incluye elementos como bordes alrededor de controles, etiquetas para contenido implícito, etc. WPF incluye un conjunto de API ( LogicalTreeHelper y ) para examinar estos dos VisualTreeHelper gráficos de objetos.
En Xamarin.Forms, los controles que define en son Page simplemente objetos de datos simples. Son similares a la representación de árbol lógico, pero nunca representan contenido por sí solos. En su lugar, son el modelo de datos que influye en la representación de elementos. La representación real se realiza mediante un conjunto independiente de representadores visuales que se asignana cada tipo de control . Estos representadores se registran en cada uno de los proyectos específicos de la plataforma mediante ensamblados de Xamarin.Forms específicos de la plataforma. Puede ver una lista aquí. Además de reemplazar o ampliar el representador, Xamarin.Forms también admite efectos que se pueden usar para influir en la representación nativa por plataforma.
Árbol lógico/visual
No hay ninguna API expuesta para recorrer el árbol lógico en Xamarin.Forms, pero puede usar reflexión para obtener la misma información. Por ejemplo, este es un método que puede enumerar los elementos secundarios lógicos con reflexión.
Gráficos
Xamarin.Forms incluye un sistema de gráficos para dibujar primitivos, que se denomina Formas. Para obtener más información sobre las formas, vea Formas de Xamarin.Forms. Además, puede incluir bibliotecas de terceros, como SkiaSharp, para obtener dibujos 2D multiplataforma.
Recursos
WPF y Xamarin.Forms tienen el concepto de recursos y diccionarios de recursos. Puede colocar cualquier tipo de objeto en con una clave y, a continuación, buscarlo con para cosas que no cambiarán o para cosas que pueden cambiar en el diccionario en tiempo ResourceDictionary{StaticResource} de {DynamicResource} ejecución. El uso y la mecánica son los mismos con una diferencia: Xamarin.Forms requiere que defina para asignar a la propiedad , mientras que WPF crea previamente uno y lo asigna ResourceDictionaryResources automáticamente.
Por ejemplo, consulte la definición siguiente:
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>
Si no define , se genera ResourceDictionary un error en tiempo de ejecución.
Estilos
Los estilos también son totalmente compatibles con Xamarin.Forms y se pueden usar para temaar los elementos de Xamarin.Forms que forman la interfaz de usuario. Admiten desencadenadores (propiedad, evento y datos), herencia a través BasedOn de y búsquedas de recursos para valores. Los estilos se aplican a los elementos explícitamente a través de la propiedad o implícitamente al no proporcionar una clave de Style recurso, al igual que WPF.
Estilos de dispositivo
WPF tiene un conjunto de propiedades predefinidas (almacenadas como valores estáticos en un conjunto de clases estáticas como ) que dictan los colores del sistema, las fuentes y las métricas en forma de valores y claves SystemColors de recursos. Xamarin.Forms es similar, pero define un conjunto de estilos de dispositivo para representar lo mismo. El marco proporciona estos estilos y se establecen en valores basados en el entorno en tiempo de ejecución (por ejemplo, accesibilidad).
WPF
<Label Text="Title" Foreground="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" />
Xamarin.Forms
<Label Text="Title" Style="{DynamicResource TitleStyle}" />