Udostępnij za pośrednictwem


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:

  1. Utwórz podklasę PlatformEffect klasy.
  2. Zastąpij metodę OnAttached i napisz logikę, aby dostosować kontrolkę.
  3. Zastąpij metodę OnDetached i napisz logikę w celu wyczyszczenia dostosowania kontrolki, jeśli jest to wymagane.
  4. 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.
  5. 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:

Obowiązki projektu efektu fokusu

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:

Nacisk na każdą platformę, skoncentrowany na kontrolceWpływ fokusu na każdej platformie, kontrolowanie nieocentrowanego

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 trycatch/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 trycatch/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 trycatch/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 trycatch/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:

  1. Zadeklaruj kontrolkę, która będzie dostosowywana przez efekt.
  2. 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 FocusEffectRoutingEffect 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.