Specifika platforem

Stáhnout ukázku Stažení ukázky

Specifika platformy umožňují využívat funkce, které jsou dostupné jenom na konkrétní platformě, bez implementace vlastních rendererů nebo efektů.

Proces využívání konkrétní platformy prostřednictvím XAML nebo rozhraní API pro plynulý kód je následující:

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

Poznámka

Upozorňujeme, že pokus o používání konkrétní platformy na platformě, kde je nedostupná, nezíská chybu. Místo toho se kód spustí, aniž by se použila konkrétní platforma.

Specifika platformy spotřebovaná prostřednictvím rozhraní On<T> API pro plynulý kód vrací IPlatformElementConfiguration objekty. To umožňuje vyvolání více specifik platformy u stejného objektu s kaskádovou metodou.

Další informace o specifikách platforem poskytovaných službou najdete v tématu Specifika platformy Xamarin.FormsXamarin.FormsAndroid Platform-Specificsa Windows platformy.

Vytváření specifik platformy

Dodavatelé mohou vytvářet vlastní specifika platformy s efekty. Účinek poskytuje konkrétní funkce, které se pak vystaví prostřednictvím specifické platformy. Výsledkem je efekt, který lze snadněji využívat prostřednictvím XAML a rozhraní API plynule ovaného kódu.

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

  1. Implementujte konkrétní funkce jako účinek. Další informace najdete v tématu Vytvoření efektu.
  2. Vytvořte třídu specifickou pro platformu, která zobrazí efekt . Další informace najdete v tématu Vytvoření Platform-Specific třídy.
  3. Ve třídě specifické pro platformu implementujte připojenou vlastnost, která umožní využití konkrétní platformy prostřednictvím XAML. Další informace najdete v tématu Přidání připojené vlastnosti.
  4. Ve třídě specifické pro platformu implementujte metody rozšíření, aby bylo možné využívat specifickou platformu prostřednictvím rozhraní API s plynulým kódem. Další informace najdete v tématu Přidání rozšiřujících metod.
  5. Upravte implementaci efektu tak, aby se účinek použil pouze v případě, že byla konkrétní platforma vyvolána na stejné platformě jako Effect. Další informace najdete v tématu Vytvoření efektu.

Výsledkem vystavení efektu jako specifického pro platformu je, že účinek lze snadněji využívat prostřednictvím XAML a rozhraní API plynule ovaného kódu.

Poznámka

Je na vás, že dodavatelé budou tuto techniku používat k vytvoření vlastních specifik platformy, aby je uživatelé snadno spotřebě usnadnili. I když se uživatelé mohou rozhodnout vytvořit vlastní specifika platformy, měli byste mít na výběr, že vyžaduje více kódu než vytváření a využívání efektu.

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

Specifické pro stínovou platformu

Ukázková aplikace implementuje specifickou platformu pro každou platformu, aby byla snadno pochopitá. Kromě každé implementace efektu specifického pro platformu je však implementace třídy Shadow z velké části stejná pro každou platformu. Proto se tato příručka zaměřuje na implementaci třídy Shadow a přidruženého efektu na jedné platformě.

Další informace o efektech najdete v tématu Přizpůsobení ovládacích prvků s efekty.

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

Specifická pro platformu se vytvoří jako public static třída:

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

Následující části popisují implementaci efektu specifického pro platformu a Shadow přidruženého efektu.

Přidání připojené vlastnosti

Aby bylo možné využití prostřednictvím XAML povolit, je nutné do konkrétní platformy přidat Shadow připojenou vlastnost:

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á vlastnost slouží k přidání efektu do ovládacího prvku, ke který je třída připojená, a k jeho IsShadowedMyCompany.LabelShadowEffectShadow odebrání. Tato připojená vlastnost OnIsShadowedPropertyChanged zaregistruje metodu , která se spustí při změně hodnoty vlastnosti. Tato metoda zase volá metodu or pro přidání nebo odebrání efektu na základě AttachEffectDetachEffect hodnoty připojené IsShadowed vlastnosti. Účinek se do ovládacího prvku přidá nebo odebere úpravou Xamarin_Forms _Element_Effects ovládacího prvku data-linktype="absolute-path">Effects kolekce.

Poznámka

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

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

Přidání rozšiřujících metod

Metody rozšíření musí být přidány do specifické platformy, aby bylo možné jejich využití Shadow prostřednictvím rozhraní API pro plynulý kód:

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 IsShadowedSetIsShadowed rozšíření a vyvolaly přistupovací objekty get a set pro IsShadowed připojenou vlastnost v uvedeném pořadí. Každá metoda rozšíření pracuje s typem , který určuje, že konkrétní platformu lze vyvolat na IPlatformElementConfiguration<iOS, FormsElement>Label instancích z iOSu.

Vytvoření efektu

Specifická Shadow platforma přidá do a odebere MyCompany.LabelShadowEffectLabel ji. Následující příklad kódu ukazuje LabelShadowEffect implementaci projektu pro 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 nastaví vlastnosti pro vytvoření stínu za předpokladu, že připojená vlastnost je nastavená na a za předpokladu, že byla konkrétní platforma vyvolána na stejné platformě, pro kterou je UpdateShadowControl.LayerIsShadowedtrueShadow implementovaný effect. Tato kontrola se provádí pomocí OnThisPlatform metody .

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

Další informace o vytvoření efektu najdete v tématu Creating an Effect and Passing Effect Parameters as Attached Properties.

Využívání specifické platformy

Specifická Shadow platforma se v XAML spotřebovává nastavením připojené vlastnosti na Shadow.IsShadowedboolean 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 v jazyce C# pomocí rozhraní FLUENT API:

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

...

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