Xamarin.Forms
Efectos
Buscar..
Introducción
Efectos simplifica las personalizaciones específicas de la plataforma. Cuando es necesario modificar las propiedades de un control de formularios de Xamarin, se pueden usar los efectos. Cuando es necesario anular los métodos de Xamarin Forms Control, se pueden usar renderizadores personalizados
Agregar efecto específico de plataforma para un control de entrada
- Cree una nueva aplicación Xamarin Forms utilizando el archivo PCL -> Nueva solución -> Aplicación multiplataforma -> Xamarin Forms -> Aplicación Forms; Nombra el proyecto como
EffectsDemo
- Bajo el proyecto iOS, agregue una nueva clase de
Effect
que herede de la clasePlatformEffect
y anule los métodosOnAttached
,OnDetached
yOnElementPropertyChanged
Observe los dos atributosResolutionGroupName
yExportEffect
, estos son necesarios para consumir este efecto del PCL / proyecto compartido.
OnAttached
es el método donde la lógica de personalización entra enOnAttached
OnDetached
es el método en el que se realiza la limpieza y laOnDetached
del registroOnElementPropertyChanged
es el método que se desencadena en los cambios de propiedad de diferentes elementos. Para identificar la propiedad correcta, verifique el cambio de propiedad exacto y agregue su lógica. En este ejemplo,OnFocus
dará el colorBlue
yOutofFocus
daráRed
colorRed
using System; using EffectsDemo.iOS; using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; [assembly: ResolutionGroupName("xhackers")] [assembly: ExportEffect(typeof(FocusEffect), "FocusEffect")] namespace EffectsDemo.iOS { public class FocusEffect : PlatformEffect { public FocusEffect() { } UIColor backgroundColor; protected override void OnAttached() { try { Control.BackgroundColor = backgroundColor = UIColor.Red; } catch (Exception ex) { Console.WriteLine("Cannot set attacked property" + ex.Message); } } protected override void OnDetached() { throw new NotImplementedException(); } protected override void OnElementPropertyChanged(System.ComponentModel.PropertyChangedEventArgs args) { base.OnElementPropertyChanged(args); try { if (args.PropertyName == "IsFocused") { if (Control.BackgroundColor == backgroundColor) { Control.BackgroundColor = UIColor.Blue; } else { Control.BackgroundColor = backgroundColor; } } } catch (Exception ex) { Console.WriteLine("Cannot set property " + ex.Message); } }
}}
Para consumir este efecto en la aplicación, en el proyecto
PCL
, cree una nueva clase llamadaFocusEffect
que herede deRoutingEffect
. Esto es esencial para que el PCL ejemplifique la implementación específica del efecto en la plataforma. Código de muestra a continuación:using Xamarin.Forms; namespace EffectsDemo { public class FocusEffect : RoutingEffect { public FocusEffect() : base("xhackers.FocusEffect") { } } }
Agrega el efecto al control de
Entry
en el XAML.<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:EffectsDemo" x:Class="EffectsDemo.EffectsDemoPage"> <StackLayout Orientation="Horizontal" HorizontalOptions="Center" VerticalOptions="Center"> <Label Text="Effects Demo" HorizontalOptions="StartAndExpand" VerticalOptions="Center" ></Label> <Entry Text="Controlled by effects" HorizontalOptions="FillAndExpand" VerticalOptions="Center"> <Entry.Effects> <local:FocusEffect> </local:FocusEffect> </Entry.Effects> </Entry> </StackLayout> </ContentPage>
Dado que el efecto se implementó solo en la versión de iOS, cuando la aplicación se ejecuta en el iOS Simulator
al enfocar los cambios de color de fondo de la Entry
y no sucede nada en el Android Emulator
ya que el Effect
no se creó en el proyecto Droid