Tworzenie efektu
Efekty upraszczają dostosowywanie kontrolki. W tym artykule pokazano, jak utworzyć efekt, który zmienia kolor tła kontrolki Entry, gdy kontrolka zyskuje fokus.
Proces tworzenia efektu w każdym projekcie specyficznym dla platformy jest następujący:
- Utwórz podklasę
PlatformEffect
klasy. - Zastąpij metodę
OnAttached
i napisz logikę, aby dostosować kontrolkę. - Zastąpij metodę
OnDetached
i napisz logikę w celu wyczyszczenia dostosowania kontrolki, jeśli jest to wymagane. ResolutionGroupName
Dodaj atrybut do klasy effect. Ten atrybut ustawia firmową szeroką przestrzeń nazw dla efektów, zapobiegając kolizjom z innymi skutkami o tej samej nazwie. Należy pamiętać, że ten atrybut można zastosować tylko raz dla każdego projektu.ExportEffect
Dodaj atrybut do klasy effect. Ten atrybut rejestruje efekt za pomocą unikatowego identyfikatora używanego przez Xamarin.Formselement , wraz z nazwą grupy, aby zlokalizować efekt przed zastosowaniem go do kontrolki. Atrybut przyjmuje dwa parametry — nazwę typu efektu i unikatowy ciąg, który będzie używany do lokalizowania efektu przed zastosowaniem go do kontrolki.
Efekt można następnie zużyć, dołączając go do odpowiedniej kontrolki.
Uwaga
Jest to opcjonalne, aby zapewnić efekt w każdym projekcie platformy. Próba użycia efektu, gdy nie jest zarejestrowana, zwróci wartość inną niż null, która nic nie robi.
Przykładowa aplikacja pokazuje FocusEffect
, że zmienia kolor tła kontrolki, gdy zyskuje fokus. Na poniższym diagramie przedstawiono obowiązki każdego projektu w przykładowej aplikacji wraz z relacjami między nimi:
Kontrolka Entry
na obiekcie HomePage
jest dostosowywana przez klasę FocusEffect
w każdym projekcie specyficznym dla platformy. Każda FocusEffect
klasa pochodzi z PlatformEffect
klasy dla każdej platformy. Powoduje to renderowanie kontrolki Entry
przy użyciu koloru tła specyficznego dla platformy, który zmienia się, gdy kontrolka zyskuje fokus, jak pokazano na poniższych zrzutach ekranu:
Tworzenie wpływu na każdą platformę
W poniższych sekcjach omówiono implementację klasy specyficznej dla platformy FocusEffect
.
Projekt systemu iOS
Poniższy przykład kodu przedstawia implementację FocusEffect
projektu systemu iOS:
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly:ResolutionGroupName ("MyCompany")]
[assembly:ExportEffect (typeof(EffectsDemo.iOS.FocusEffect), nameof(EffectsDemo.iOS.FocusEffect))]
namespace EffectsDemo.iOS
{
public class FocusEffect : PlatformEffect
{
UIColor backgroundColor;
protected override void OnAttached ()
{
try {
Control.BackgroundColor = backgroundColor = UIColor.FromRGB (204, 153, 255);
} catch (Exception ex) {
Console.WriteLine ("Cannot set property on attached control. Error: ", ex.Message);
}
}
protected override void OnDetached ()
{
}
protected override void OnElementPropertyChanged (PropertyChangedEventArgs args)
{
base.OnElementPropertyChanged (args);
try {
if (args.PropertyName == "IsFocused") {
if (Control.BackgroundColor == backgroundColor) {
Control.BackgroundColor = UIColor.White;
} else {
Control.BackgroundColor = backgroundColor;
}
}
} catch (Exception ex) {
Console.WriteLine ("Cannot set property on attached control. Error: ", ex.Message);
}
}
}
}
Metoda OnAttached
ustawia BackgroundColor
właściwość kontrolki na jasny purpurowy z UIColor.FromRGB
metodą , a także przechowuje ten kolor w polu. Ta funkcja jest owinięta try
catch
/w bloku, jeśli kontrolka, do którego jest dołączony efekt, nie ma BackgroundColor
właściwości. Żadna implementacja nie jest dostarczana przez metodę OnDetached
, ponieważ nie jest konieczne czyszczenie.
Przesłonięcia OnElementPropertyChanged
reagują na zmiany właściwości, które można powiązać w kontrolce Xamarin.Forms . IsFocused
Gdy właściwość zmieni się, właściwość kontrolki zostanie zmieniona na białą, BackgroundColor
jeśli kontrolka ma fokus, w przeciwnym razie zostanie zmieniona na jasnopurpurową. Ta funkcja jest owinięta try
catch
/w bloku, jeśli kontrolka, do którego jest dołączony efekt, nie ma BackgroundColor
właściwości.
Projekt systemu Android
Poniższy przykład kodu przedstawia implementację FocusEffect
projektu systemu Android:
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ResolutionGroupName("MyCompany")]
[assembly: ExportEffect(typeof(EffectsDemo.Droid.FocusEffect), nameof(EffectsDemo.Droid.FocusEffect))]
namespace EffectsDemo.Droid
{
public class FocusEffect : PlatformEffect
{
Android.Graphics.Color originalBackgroundColor = new Android.Graphics.Color(0, 0, 0, 0);
Android.Graphics.Color backgroundColor;
protected override void OnAttached()
{
try
{
backgroundColor = Android.Graphics.Color.LightGreen;
Control.SetBackgroundColor(backgroundColor);
}
catch (Exception ex)
{
Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message);
}
}
protected override void OnDetached()
{
}
protected override void OnElementPropertyChanged(System.ComponentModel.PropertyChangedEventArgs args)
{
base.OnElementPropertyChanged(args);
try
{
if (args.PropertyName == "IsFocused")
{
if (((Android.Graphics.Drawables.ColorDrawable)Control.Background).Color == backgroundColor)
{
Control.SetBackgroundColor(originalBackgroundColor);
}
else
{
Control.SetBackgroundColor(backgroundColor);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message);
}
}
}
}
Metoda OnAttached
wywołuje metodę SetBackgroundColor
, aby ustawić kolor tła kontrolki na jasnozielony, a także przechowuje ten kolor w polu. Ta funkcja jest owinięta try
catch
/w bloku, jeśli kontrolka, do którego jest dołączony efekt, nie ma SetBackgroundColor
właściwości. Żadna implementacja nie jest dostarczana przez metodę OnDetached
, ponieważ nie jest konieczne czyszczenie.
Przesłonięcia OnElementPropertyChanged
reagują na zmiany właściwości, które można powiązać w kontrolce Xamarin.Forms . IsFocused
Gdy właściwość zmieni się, kolor tła kontrolki zostanie zmieniony na biały, jeśli kontrolka ma fokus, w przeciwnym razie zmieni się na jasnozielony. Ta funkcja jest owinięta try
catch
/w bloku, jeśli kontrolka, do którego jest dołączony efekt, nie ma BackgroundColor
właściwości.
projekty platforma uniwersalna systemu Windows
Poniższy przykład kodu przedstawia implementację FocusEffect
projektów platformy platforma uniwersalna systemu Windows (UWP):
using Xamarin.Forms;
using Xamarin.Forms.Platform.UWP;
[assembly: ResolutionGroupName("MyCompany")]
[assembly: ExportEffect(typeof(EffectsDemo.UWP.FocusEffect), nameof(EffectsDemo.UWP.FocusEffect))]
namespace EffectsDemo.UWP
{
public class FocusEffect : PlatformEffect
{
protected override void OnAttached()
{
try
{
(Control as Windows.UI.Xaml.Controls.Control).Background = new SolidColorBrush(Colors.Cyan);
(Control as FormsTextBox).BackgroundFocusBrush = new SolidColorBrush(Colors.White);
}
catch (Exception ex)
{
Debug.WriteLine("Cannot set property on attached control. Error: ", ex.Message);
}
}
protected override void OnDetached()
{
}
}
}
Metoda OnAttached
ustawia Background
właściwość kontrolki na cyjan i ustawia BackgroundFocusBrush
właściwość na biały. Ta funkcja jest owinięta try
/catch
w bloku, jeśli kontrolka, do którego jest dołączony efekt, nie ma tych właściwości. Żadna implementacja nie jest dostarczana przez metodę OnDetached
, ponieważ nie jest konieczne czyszczenie.
Korzystanie z efektu
Proces korzystania z efektu z Xamarin.Forms biblioteki .NET Standard lub projektu biblioteki udostępnionej jest następujący:
- Zadeklaruj kontrolkę, która będzie dostosowywana przez efekt.
- Dołącz efekt do kontrolki, dodając go do kolekcji kontrolki
Effects
.
Uwaga
Wystąpienie efektu może być dołączone tylko do pojedynczej kontrolki. W związku z tym należy dwukrotnie rozwiązać efekt, aby można było go użyć w dwóch kontrolkach.
Korzystanie z efektu w języku XAML
Poniższy przykład kodu XAML przedstawia kontrolkę Entry
, do której FocusEffect
jest dołączony element :
<Entry Text="Effect attached to an Entry" ...>
<Entry.Effects>
<local:FocusEffect />
</Entry.Effects>
...
</Entry>
Klasa FocusEffect
w bibliotece .NET Standard obsługuje użycie efektu w języku XAML i jest pokazana w poniższym przykładzie kodu:
public class FocusEffect : RoutingEffect
{
public FocusEffect () : base ($"MyCompany.{nameof(FocusEffect)}")
{
}
}
Podklasa FocusEffect
RoutingEffect
klasy, która reprezentuje efekt niezależny od platformy, który opakowuje efekt wewnętrzny, który jest zwykle specyficzny dla platformy. Klasa FocusEffect
wywołuje konstruktor klasy bazowej, przekazując parametr składający się z łączenia nazwy grupy rozpoznawania (określonej przy użyciu atrybutu ResolutionGroupName
klasy efektów) i unikatowy identyfikator, który został określony przy użyciu atrybutu ExportEffect
w klasie efektu. W związku z tym po Entry
zainicjowaniu obiektu w czasie wykonywania do kolekcji kontrolki Effects
zostanie dodane nowe wystąpienie MyCompany.FocusEffect
obiektu .
Efekty mogą być również dołączane do kontrolek przy użyciu zachowania lub przy użyciu dołączonych właściwości. Aby uzyskać więcej informacji na temat dołączania efektu do kontrolki przy użyciu zachowania, zobacz Efekt wielokrotnego użytkuBehavior. Aby uzyskać więcej informacji na temat dołączania efektu do kontrolki przy użyciu dołączonych właściwości, zobacz Przekazywanie parametrów do efektu.
Korzystanie z efektu w języku C#
Odpowiednik Entry
w języku C# jest pokazany w poniższym przykładzie kodu:
var entry = new Entry {
Text = "Effect attached to an Entry",
...
};
Element FocusEffect
jest dołączony do Entry
wystąpienia przez dodanie efektu do kolekcji kontrolki Effects
, jak pokazano w poniższym przykładzie kodu:
public HomePageCS ()
{
...
entry.Effects.Add (Effect.Resolve ($"MyCompany.{nameof(FocusEffect)}"));
...
}
Zwraca Effect.Resolve
wartość Effect
dla określonej nazwy, która jest łączeniem nazwy grupy rozpoznawania (określonej przy użyciu atrybutu ResolutionGroupName
klasy efektu) i unikatowym identyfikatorem, który został określony przy użyciu atrybutu ExportEffect
w klasie efektu. Jeśli platforma nie zapewnia efektu, Effect.Resolve
metoda zwróci wartość innąnull
niż .
Podsumowanie
W tym artykule pokazano, jak utworzyć efekt, który zmienia kolor tła kontrolki Entry
, gdy kontrolka zyskuje fokus.