Xamarin.Forms
Efekty
Szukaj…
Wprowadzenie
Efekty upraszczają dostosowania specyficzne dla platformy. Gdy zachodzi potrzeba modyfikacji właściwości formantu Xamarin Forms, można zastosować Efekty. Gdy zachodzi potrzeba zastąpienia metod Xamarin Forms Control, można użyć niestandardowych mechanizmów renderujących
Dodanie efektu specyficznego dla platformy do kontroli wejścia
- Utwórz nową aplikację Xamarin Forms za pomocą pliku PCL -> Nowe rozwiązanie -> Aplikacja wieloplatformowa -> Xamarin Forms -> Aplikacja Forms; Nazwij projekt jako
EffectsDemo
- W ramach projektu iOS dodaj nową klasę
Effect
która dziedziczy z klasyPlatformEffect
i zastępuje metodyOnAttached
,OnDetached
iOnElementPropertyChanged
Zwróć uwagę na dwa atrybutyResolutionGroupName
iExportEffect
, które są wymagane do wykorzystania tego efektu z projektu PCL / współdzielonego.
OnAttached
to metoda, w którąOnAttached
się logika dostosowywaniaOnDetached
to metoda, w której odbywa się czyszczenie i wyrejestrowywanieOnElementPropertyChanged
to metoda uruchamiana po zmianie właściwości różnych elementów. Aby zidentyfikować właściwą właściwość, sprawdź dokładną zmianę właściwości i dodaj swoją logikę. W tym przykładzieOnFocus
da kolorBlue
aOutofFocus
kolorRed
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); } }
}}
Aby wykorzystać ten efekt w aplikacji, w ramach projektu
PCL
utwórz nową klasę o nazwieFocusEffect
która będzie dziedziczyć poRoutingEffect
. Jest to niezbędne, aby PCL utworzył instancję specyficzną dla platformy implementacji efektu. Przykładowy kod poniżej:using Xamarin.Forms; namespace EffectsDemo { public class FocusEffect : RoutingEffect { public FocusEffect() : base("xhackers.FocusEffect") { } } }
Dodaj efekt do kontroli
Entry
w 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>
Ponieważ efekt został zaimplementowany tylko w wersji iOS, kiedy aplikacja działa w iOS Simulator
po skupieniu się na zmianach koloru tła Entry
i nic się nie dzieje w Android Emulator
ponieważ Effect
nie został utworzony w projekcie Droid