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í:
- Přidejte deklaraci nebo
using
direktivuXamarin.Forms.PlatformConfiguration
xmlns
pro obor názvů. - Přidejte deklaraci nebo
using
direktivuxmlns
pro obor názvů, který obsahuje funkce specifické pro platformu:- V iOSu se jedná o
Xamarin.Forms.PlatformConfiguration.iOSSpecific
obor názvů. - V Androidu
Xamarin.Forms.PlatformConfiguration.AndroidSpecific
je to obor názvů. Pro Android AppCompat se jedná oXamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat
obor názvů. - V Univerzální platforma Windows se jedná o
Xamarin.Forms.PlatformConfiguration.WindowsSpecific
obor názvů.
- V iOSu se jedná o
- Použijte platformu specifickou pro XAML nebo kód s rozhraním
On<T>
FLUENT API. HodnotaT
může býtiOS
,Android
neboWindows
typy zXamarin.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í:
- Implementujte konkrétní funkce jako efekt. Další informace naleznete v tématu Vytvoření efektu.
- Vytvořte třídu specifickou pro platformu, která zpřístupní efekt. Další informace naleznete v tématu Vytvoření třídy specifické pro platformu.
- 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.
- 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.
- 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:
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 Label
odebere 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);