Introducción a los efectosIntroduction to Effects

Con los efectos se pueden personalizar los controles nativos de cada plataforma y normalmente se usan para pequeños cambios de estilo. En este artículo se proporciona una introducción a los efectos, se describe el límite entre los efectos y los representadores personalizados, y se describe la clase PlatformEffect.Effects allow the native controls on each platform to be customized, and are typically used for small styling changes. This article provides an introduction to effects, outlines the boundary between effects and custom renderers, and describes the PlatformEffect class.

En Páginas, diseños y controles de Xamarin.Forms se presenta una API común para describir interfaces de usuario móviles multiplataforma.Xamarin.Forms Pages, Layouts and Controls presents a common API to describe cross-platform mobile user interfaces. Cada página, diseño y control se representan de forma diferente en cada plataforma mediante una clase Renderer que, a su vez, crea un control nativo (correspondiente a la representación de Xamarin.Forms), lo organiza en la pantalla y agrega el comportamiento especificado en el código compartido.Each page, layout, and control is rendered differently on each platform using a Renderer class that in turn creates a native control (corresponding to the Xamarin.Forms representation), arranges it on the screen, and adds the behavior specified in the shared code.

Los desarrolladores pueden implementar sus propias clases Renderer personalizadas para personalizar la apariencia o el comportamiento de un control.Developers can implement their own custom Renderer classes to customize the appearance and/or behavior of a control. Pero la implementación de una clase de representador personalizado para llevar a cabo una personalización de controles simples suele ser una respuesta compleja.However, implementing a custom renderer class to perform a simple control customization is often a heavy-weight response. Los efectos simplifican este proceso y permiten que los controles nativos de cada plataforma se puedan personalizar más fácilmente.Effects simplify this process, allowing the native controls on each platform to be more easily customized.

Los efectos se crean en proyectos específicos de la plataforma mediante la creación de subclases del control PlatformEffect, y después se consumen adjuntándolos a un control adecuado en una biblioteca de .NET Standard de Xamarin.Forms o un proyecto de biblioteca compartida.Effects are created in platform-specific projects by subclassing the PlatformEffect control, and then the effects are consumed by attaching them to an appropriate control in a Xamarin.Forms .NET Standard library or Shared Library project.

¿Por qué usar un efecto en lugar de un representador personalizado?Why Use an Effect over a Custom Renderer?

Los efectos simplifican la personalización de un control, son reutilizables y se pueden parametrizar para aumentar todavía más la reutilización.Effects simplify the customization of a control, are reusable, and can be parameterized to further increase reuse.

Todo lo que se puede lograr con un efecto también se puede lograr con un representador personalizado.Anything that can be achieved with an effect can also be achieved with a custom renderer. Pero los representadores personalizados ofrecen más flexibilidad y personalización que los efectos.However, custom renderers offer more flexibility and customization than effects. En las instrucciones siguientes se enumeran las circunstancias bajo las que elegir un efecto en lugar de un representador personalizado:The following guidelines list the circumstances in which to choose an effect over a custom renderer:

  • Un efecto se recomienda cuando el cambio de las propiedades de un control específico de la plataforma proporcionará el resultado deseado.An effect is recommended when changing the properties of a platform-specific control will achieve the desired result.
  • Un representador personalizado es necesario cuando hay que invalidar los métodos de un control específico de la plataforma.A custom renderer is required when there's a need to override methods of a platform-specific control.
  • Un representador personalizado es necesario cuando hay que reemplazar el control específico de la plataforma que implementa un control de Xamarin.Forms.A custom renderer is required when there's a need to replace the platform-specific control that implements a Xamarin.Forms control.

Creación de subclases de la clase PlatformEffectSubclassing the PlatformEffect Class

En la tabla siguiente se muestra el espacio de nombres para la clase PlatformEffect en cada plataforma y los tipos de sus propiedades:The following table lists the namespace for the PlatformEffect class on each platform, and the types of its properties:

PlataformaPlatform Espacio de nombresNamespace ContenedorContainer ControlControl
iOSiOS Xamarin.Forms.Platform.iOSXamarin.Forms.Platform.iOS UIViewUIView UIViewUIView
AndroidAndroid Xamarin.Forms.Platform.AndroidXamarin.Forms.Platform.Android ViewGroupViewGroup VerView
Plataforma universal de Windows (UWP)Universal Windows Platform (UWP) Xamarin.Forms.Platform.UWPXamarin.Forms.Platform.UWP FrameworkElementFrameworkElement FrameworkElementFrameworkElement

Cada una de las clases PlatformEffect específicas de la plataforma expone las propiedades siguientes:Each platform-specific PlatformEffect class exposes the following properties:

  • Container: hace referencia al control específico de la plataforma que se usa para implementar el diseño.Container – references the platform-specific control being used to implement the layout.
  • Control: hace referencia al control específico de la plataforma que se usa para implementar el control de Xamarin.Forms.Control – references the platform-specific control being used to implement the Xamarin.Forms control.
  • Element: hace referencia al control de Xamarin.Forms que se va a representar.Element – references the Xamarin.Forms control that's being rendered.

Los efectos no tienen información de tipo sobre el contenedor, el control o el elemento al que se adjuntan, ya que se pueden adjuntar a cualquier elemento.Effects do not have type information about the container, control, or element they are attached to because they can be attached to any element. Por tanto, cuando se adjunta un efecto a un elemento que no es compatible, se debe degradar correctamente o iniciar una excepción.Therefore, when an effect is attached to an element that it doesn't support it should degrade gracefully or throw an exception. Pero las propiedades Container, Control y Element se pueden convertir a su tipo de implementación.However, the Container, Control, and Element properties can be cast to their implementing type. Para obtener más información sobre estos tipos, vea Clases base y controles nativos del representador.For more information about these types see Renderer Base Classes and Native Controls.

Cada clase PlatformEffect específica de la plataforma expone los métodos siguientes, que se deben invalidar para implementar un efecto:Each platform-specific PlatformEffect class exposes the following methods, which must be overridden to implement an effect:

  • OnAttached: se llama cuando se adjunta un efecto a un control de Xamarin.Forms.OnAttached – called when an effect is attached to a Xamarin.Forms control. Una versión invalidada de este método, en cada clase de efecto específica de la plataforma, es el lugar para realizar la personalización del control, junto con el control de excepciones en caso de que no se pueda aplicar el efecto al control de Xamarin.Forms especificado.An overridden version of this method, in each platform-specific effect class, is the place to perform customization of the control, along with exception handling in case the effect cannot be applied to the specified Xamarin.Forms control.
  • OnDetached: se llama cuando se desasocia un efecto de un control de Xamarin.Forms.OnDetached – called when an effect is detached from a Xamarin.Forms control. Una versión invalidada de este método, en cada clase de efecto específica de la plataforma, es el lugar para realizar cualquier limpieza de efectos, como anular el registro de un controlador de eventos.An overridden version of this method, in each platform-specific effect class, is the place to perform any effect cleanup such as de-registering an event handler.

Además, PlatformEffect expone el método OnElementPropertyChanged, que también se puede invalidar.In addition, the PlatformEffect exposes the OnElementPropertyChanged method, which can also be overridden. Este método se llama cuando ha cambiado una propiedad del elemento.This method is called when a property of the element has changed. Una versión invalidada de este método, en cada clase de efecto específica de la plataforma, es el lugar para responder a los cambios de propiedad enlazable en el control de Xamarin.Forms.An overridden version of this method, in each platform-specific effect class, is the place to respond to bindable property changes on the Xamarin.Forms control. Siempre se debe realizar una comprobación de la propiedad que ha modificado, ya que esta invalidación se puede llamar varias veces.A check for the property that's changed should always be made, as this override can be called many times.