Specifika platforem

Specifické platformy umožňují využívat funkce, které jsou dostupné jenom na konkrétní platformě, aniž byste implementovali vlastní renderery nebo efekty.

Proces využívání platformy specifické pro platformu prostřednictvím XAML nebo rozhraní API fluent kódu je následující:

  1. Přidejte deklaraci nebo using direktivu Xamarin.Forms.PlatformConfigurationxmlns pro obor názvů.
  2. Přidejte deklaraci nebo using direktivu xmlns pro obor názvů, který obsahuje funkce specifické pro platformu:
    1. V iOSu se jedná o Xamarin.Forms.PlatformConfiguration.iOSSpecific obor názvů.
    2. V Androidu Xamarin.Forms.PlatformConfiguration.AndroidSpecific je to obor názvů. Pro Android AppCompat se jedná o Xamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat obor názvů.
    3. V Univerzální platforma Windows se jedná o Xamarin.Forms.PlatformConfiguration.WindowsSpecific obor názvů.
  3. Použijte platformu specifickou pro XAML nebo kód s rozhraním On<T> FLUENT API. Hodnota T může být iOS, Androidnebo Windows typy z Xamarin.Forms.PlatformConfiguration oboru názvů.

Poznámka:

Upozorňujeme, že pokus o využití konkrétní platformy na platformě, kde není k dispozici, nebude mít za následek chybu. Místo toho se kód spustí bez použití specifické platformy.

Specifická pro platformu On<T> využívaná prostřednictvím objektů vracejících IPlatformElementConfiguration objekty rozhraní API fluent kódu. To umožňuje vyvolání více specifik platforem na stejném objektu s kaskádovou metodou.

Další informace o specifikách platformy, které Xamarin.Formsposkytuje , naleznete v tématu Specifické platformy pro iOS, Specifické platformy Android a Specifické platformy Systému Windows.

Vytváření specifických pro platformu

Dodavatelé můžou vytvářet vlastní specifika platformy s efekty. Efekt poskytuje konkrétní funkce, které se pak zveřejňují prostřednictvím specifické platformy. Výsledkem je efekt, který lze snadněji využívat prostřednictvím XAML a rozhraní API fluentu kódu.

Proces vytvoření specifické platformy je následující:

  1. Implementujte konkrétní funkce jako efekt. Další informace naleznete v tématu Vytvoření efektu.
  2. Vytvořte třídu specifickou pro platformu, která zpřístupní efekt. Další informace naleznete v tématu Vytvoření třídy specifické pro platformu.
  3. Ve třídě specifické pro platformu implementujte připojenou vlastnost, která umožňuje využití specifické platformy prostřednictvím XAML. Další informace naleznete v tématu Přidání připojené vlastnosti.
  4. Ve třídě specifické pro platformu implementujte rozšiřující metody, které umožňují využívat rozhraní API fluentu kódu specifické pro danou platformu. Další informace naleznete v tématu Přidání rozšiřujících metod.
  5. Upravte implementaci efektu tak, aby se efekt použil pouze v případě, že byl konkrétní platformu vyvolán na stejné platformě jako efekt. Další informace naleznete v tématu Vytvoření efektu.

Výsledkem zveřejnění efektu jako specifického pro platformu je, že efekt lze snadněji využívat prostřednictvím XAML a rozhraní API pro fluent kód.

Poznámka:

Předpokládá se, že dodavatelé budou tuto techniku používat k vytvoření vlastních specifik platforem, aby je uživatelé mohli snadno využívat. I když se uživatelé mohou rozhodnout vytvořit vlastní specifika platformy, je třeba poznamenat, že vyžaduje více kódu než vytváření a využívání efektu.

Ukázková aplikace demonstruje specifickou platformu Shadow , která přidává stín k textu zobrazenému ovládacím Label prvku:

Specifická pro stínovou platformu

Ukázková aplikace implementuje platformu specifickou Shadow pro každou platformu a usnadňuje pochopení. Kromě každé implementace efektu specifické pro platformu je implementace třídy Shadow z velké části identická pro každou platformu. Tento průvodce se proto zaměřuje na implementaci třídy Shadow a souvisejícího efektu na jedné platformě.

Další informace o efektech naleznete v tématu Přizpůsobení ovládacích prvků pomocí efektů.

Vytvoření třídy specifické pro platformu

Platforma specifická se vytvoří jako public static třída:

namespace MyCompany.Forms.PlatformConfiguration.iOS
{
  public static Shadow
  {
    ...
  }
}

Následující části se týkají implementace specifické platformy a přidruženého Shadow efektu.

Přidání připojené vlastnosti

Připojená vlastnost musí být přidána do Shadow konkrétní platformy, aby bylo možné používat prostřednictvím XAML:

namespace MyCompany.Forms.PlatformConfiguration.iOS
{
    using System.Linq;
    using Xamarin.Forms;
    using Xamarin.Forms.PlatformConfiguration;
    using FormsElement = Xamarin.Forms.Label;

    public static class Shadow
    {
        const string EffectName = "MyCompany.LabelShadowEffect";

        public static readonly BindableProperty IsShadowedProperty =
            BindableProperty.CreateAttached("IsShadowed",
                                            typeof(bool),
                                            typeof(Shadow),
                                            false,
                                            propertyChanged: OnIsShadowedPropertyChanged);

        public static bool GetIsShadowed(BindableObject element)
        {
            return (bool)element.GetValue(IsShadowedProperty);
        }

        public static void SetIsShadowed(BindableObject element, bool value)
        {
            element.SetValue(IsShadowedProperty, value);
        }

        ...

        static void OnIsShadowedPropertyChanged(BindableObject element, object oldValue, object newValue)
        {
            if ((bool)newValue)
            {
                AttachEffect(element as FormsElement);
            }
            else
            {
                DetachEffect(element as FormsElement);
            }
        }

        static void AttachEffect(FormsElement element)
        {
            IElementController controller = element;
            if (controller == null || controller.EffectIsAttached(EffectName))
            {
                return;
            }
            element.Effects.Add(Effect.Resolve(EffectName));
        }

        static void DetachEffect(FormsElement element)
        {
            IElementController controller = element;
            if (controller == null || !controller.EffectIsAttached(EffectName))
            {
                return;
            }

            var toRemove = element.Effects.FirstOrDefault(e => e.ResolveId == Effect.Resolve(EffectName).ResolveId);
            if (toRemove != null)
            {
                element.Effects.Remove(toRemove);
            }
        }
    }
}

Připojená IsShadowed vlastnost slouží k přidání efektu MyCompany.LabelShadowEffect a odebrání z ovládacího prvku, ke kterému Shadow je třída připojena. Tato připojená vlastnost registruje metodu OnIsShadowedPropertyChanged , která se spustí při změně hodnoty vlastnosti. Tato metoda pak volá metodu AttachEffect , DetachEffect která přidá nebo odebere účinek na základě hodnoty IsShadowed připojené vlastnosti. Efekt se přidá nebo odebere z ovládacího prvku úpravou kolekce ovládacího prvku Effects .

Poznámka:

Všimněte si, že efekt je vyřešen zadáním hodnoty, která je zřetězení názvu skupiny překladu a jedinečného identifikátoru zadaného v implementaci Effect. Další informace naleznete v tématu Vytvoření efektu.

Další informace o připojených vlastnostech naleznete v tématu Připojené vlastnosti.

Přidání metod rozšíření

Metody rozšíření musí být přidány do Shadow rozhraní API pro konkrétní platformu, aby bylo možné používat prostřednictvím rozhraní API fluentu kódu:

namespace MyCompany.Forms.PlatformConfiguration.iOS
{
    using System.Linq;
    using Xamarin.Forms;
    using Xamarin.Forms.PlatformConfiguration;
    using FormsElement = Xamarin.Forms.Label;

    public static class Shadow
    {
        ...
        public static bool IsShadowed(this IPlatformElementConfiguration<iOS, FormsElement> config)
        {
            return GetIsShadowed(config.Element);
        }

        public static IPlatformElementConfiguration<iOS, FormsElement> SetIsShadowed(this IPlatformElementConfiguration<iOS, FormsElement> config, bool value)
        {
            SetIsShadowed(config.Element, value);
            return config;
        }
        ...
    }
}

Metody IsShadowed rozšíření SetIsShadowed vyvolávají přístupové objekty get a set pro připojenou IsShadowed vlastnost v uvedeném pořadí. Každá metoda rozšíření pracuje s IPlatformElementConfiguration<iOS, FormsElement> typem, který určuje, že konkrétní platformu lze vyvolat na Label instancích z iOSu.

Vytvoření efektu

Specifická Shadow platforma přidá MyCompany.LabelShadowEffect do a Labelodebere ho. Následující příklad kódu ukazuje implementaci LabelShadowEffect projektu iOS:

[assembly: ResolutionGroupName("MyCompany")]
[assembly: ExportEffect(typeof(LabelShadowEffect), "LabelShadowEffect")]
namespace ShadowPlatformSpecific.iOS
{
    public class LabelShadowEffect : PlatformEffect
    {
        protected override void OnAttached()
        {
            UpdateShadow();
        }

        protected override void OnDetached()
        {
        }

        protected override void OnElementPropertyChanged(PropertyChangedEventArgs args)
        {
            base.OnElementPropertyChanged(args);

            if (args.PropertyName == Shadow.IsShadowedProperty.PropertyName)
            {
                UpdateShadow();
            }
        }

        void UpdateShadow()
        {
            try
            {
                if (((Label)Element).OnThisPlatform().IsShadowed())
                {
                    Control.Layer.CornerRadius = 5;
                    Control.Layer.ShadowColor = UIColor.Black.CGColor;
                    Control.Layer.ShadowOffset = new CGSize(5, 5);
                    Control.Layer.ShadowOpacity = 1.0f;
                }
                else if (!((Label)Element).OnThisPlatform().IsShadowed())
                {
                    Control.Layer.ShadowOpacity = 0;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message);
            }
        }
    }
}

Metoda UpdateShadow nastaví Control.Layer vlastnosti pro vytvoření stínu za předpokladu, že IsShadowed připojená vlastnost je nastavena na true, a za předpokladu, že Shadow platforma-specific byla vyvolána na stejné platformě, pro kterou je efekt implementován. Tato kontrola se provádí s metodou OnThisPlatform .

Pokud se Shadow.IsShadowed hodnota připojené vlastnosti změní za běhu, efekt musí reagovat odebráním stínu. Proto se přepsáná verze OnElementPropertyChanged metody používá k reakci na změnu vlastnosti bindable voláním UpdateShadow metody.

Další informace o vytvoření efektu naleznete v tématu Vytvoření efektu a předávání parametrů efektu jako připojené vlastnosti.

Využívání platformy specifické pro danou platformu

Specifická Shadow platforma se využívá v XAML nastavením Shadow.IsShadowed připojené vlastnosti na boolean hodnotu:

<ContentPage xmlns:ios="clr-namespace:MyCompany.Forms.PlatformConfiguration.iOS" ...>
  ...
  <Label Text="Label Shadow Effect" ios:Shadow.IsShadowed="true" ... />
  ...
</ContentPage>

Alternativně ho můžete využívat z jazyka C# pomocí rozhraní FLUENT API:

using Xamarin.Forms.PlatformConfiguration;
using MyCompany.Forms.PlatformConfiguration.iOS;

...

shadowLabel.On<iOS>().SetIsShadowed(true);