Plattformeigenschaften
Plattformspezifische Funktionen ermöglichen es Ihnen, Funktionen zu nutzen, die nur auf einer bestimmten Plattform verfügbar sind, ohne benutzerdefinierte Renderer oder Effekte zu implementieren.
Der Prozess für die Verwendung einer plattformspezifischen über XAML oder über die Fluent-Code-API lautet wie folgt:
- Fügen Sie eine
xmlns
Deklaration oderusing
Direktive für denXamarin.Forms.PlatformConfiguration
Namespace hinzu. - Fügen Sie eine
xmlns
Deklaration oderusing
Direktive für den Namespace hinzu, der die plattformspezifische Funktionalität enthält:- Unter iOS ist dies der
Xamarin.Forms.PlatformConfiguration.iOSSpecific
Namespace. - Unter Android ist dies der
Xamarin.Forms.PlatformConfiguration.AndroidSpecific
Namespace. Für Android AppCompat ist dies derXamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat
Namespace. - Im Universelle Windows-Plattform ist dies der
Xamarin.Forms.PlatformConfiguration.WindowsSpecific
Namespace.
- Unter iOS ist dies der
- Wenden Sie die plattformspezifische aus XAML oder aus Code mit der
On<T>
Fluent-API an. Der Wert kannT
dieiOS
,Android
, oderWindows
Typen aus demXamarin.Forms.PlatformConfiguration
Namespace sein.
Hinweis
Beachten Sie, dass der Versuch, eine plattformspezifische Plattform auf einer Plattform zu nutzen, auf der sie nicht verfügbar ist, nicht zu einem Fehler führt. Stattdessen wird der Code ohne die plattformspezifische Anwendung ausgeführt.
Plattformspezifische Elemente, die über die On<T>
Fluent-Code-API genutzt werden, geben Objekte zurück IPlatformElementConfiguration
. Auf diese Weise können mehrere plattformspezifische Objekte für dasselbe Objekt mit Methodenkakadierung aufgerufen werden.
Weitere Informationen zu den plattformspezifischen Xamarin.FormsAngaben finden Sie unter iOS-Plattformspezifischen, Android-Plattformspezifischen und Windows-Plattformspezifischen.
Erstellen von Plattformspezifischen
Anbieter können ihre eigenen Plattformspezifischen mit Effects erstellen. Ein Effekt stellt die spezifische Funktionalität bereit, die dann über eine plattformspezifische Verfügbar gemacht wird. Das Ergebnis ist ein Effekt, der einfacher über XAML und über eine Fluent-Code-API genutzt werden kann.
Der Prozess zum Erstellen einer plattformspezifischen Plattform lautet wie folgt:
- Implementieren Sie die spezifische Funktionalität als Effekt. Weitere Informationen finden Sie unter Erstellen eines Effekts.
- Erstellen Sie eine plattformspezifische Klasse, die den Effekt verfügbar macht. Weitere Informationen finden Sie unter Erstellen einer plattformspezifischen Klasse.
- Implementieren Sie in der plattformspezifischen Klasse eine angefügte Eigenschaft, um die plattformspezifische Nutzung über XAML zu ermöglichen. Weitere Informationen finden Sie unter Hinzufügen einer angefügten Eigenschaft.
- Implementieren Sie in der plattformspezifischen Klasse Erweiterungsmethoden, um die plattformspezifische Nutzung über eine Fluent-Code-API zu ermöglichen. Weitere Informationen finden Sie unter Hinzufügen von Erweiterungsmethoden.
- Ändern Sie die Effektimplementierung so, dass der Effekt nur angewendet wird, wenn die plattformspezifische Plattform auf derselben Plattform wie der Effekt aufgerufen wurde. Weitere Informationen finden Sie unter Creating the Effect.
Das Ergebnis der Bereitstellung eines Effekts als plattformspezifisch ist, dass der Effekt einfacher über XAML und über eine Fluent-Code-API genutzt werden kann.
Hinweis
Es ist vorgesehen, dass Anbieter diese Technik verwenden werden, um ihre eigenen Plattformspezifischen zu erstellen, um benutzerfreundliche Nutzung zu ermöglichen. Benutzer können zwar ihre eigenen Plattformspezifischen erstellen, es sollte jedoch beachtet werden, dass mehr Code erforderlich ist als das Erstellen und Verwenden eines Effekts.
Die Beispielanwendung veranschaulicht eine Shadow
plattformspezifische Anwendung, die dem Text, der von einem Label
Steuerelement angezeigt wird, einen Schatten hinzufügt:
Die Beispielanwendung implementiert die Shadow
plattformspezifischen Plattform auf jeder Plattform, um das Verständnis zu erleichtern. Abgesehen von jeder plattformspezifischen Effect-Implementierung ist die Implementierung der Shadow-Klasse jedoch weitgehend identisch für jede Plattform. Daher konzentriert sich dieses Handbuch auf die Implementierung der Shadow-Klasse und den damit verbundenen Effekt auf einer einzelnen Plattform.
Weitere Informationen zu Effekten finden Sie unter Anpassen von Steuerelementen mit Effekten.
Erstellen einer plattformspezifischen Klasse
Eine plattformspezifische Klasse wird als public static
Klasse erstellt:
namespace MyCompany.Forms.PlatformConfiguration.iOS
{
public static Shadow
{
...
}
}
In den folgenden Abschnitten wird die Implementierung des Shadow
plattformspezifischen und damit verbundenen Effekts erläutert.
Hinzufügen einer angefügten Eigenschaft
Eine angefügte Eigenschaft muss der Shadow
plattformspezifischen Eigenschaft hinzugefügt werden, um den Verbrauch über XAML zu ermöglichen:
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);
}
}
}
}
Die IsShadowed
angefügte Eigenschaft wird verwendet, um den MyCompany.LabelShadowEffect
Effekt hinzuzufügen und daraus zu entfernen, dem Steuerelement, an das die Shadow
Klasse angefügt ist. Diese angefügte Eigenschaft registriert die OnIsShadowedPropertyChanged
-Methode, die ausgeführt wird, wenn der Wert der Eigenschaft geändert wird. Diese Methode ruft wiederum die AttachEffect
Oder-Methode DetachEffect
auf, um den Effekt basierend auf dem Wert der IsShadowed
angefügten Eigenschaft hinzuzufügen oder zu entfernen. Der Effekt wird dem Steuerelement hinzugefügt oder daraus entfernt, indem die Auflistung des Steuerelements Effects
geändert wird.
Hinweis
Beachten Sie, dass der Effekt aufgelöst wird, indem ein Wert angegeben wird, der eine Verkettung des Auflösungsgruppennamens und des eindeutigen Bezeichners darstellt, der für die Effektimplementierung angegeben ist. Weitere Informationen finden Sie unter Erstellen eines Effekts.
Weitere Informationen zu angefügten Eigenschaften finden Sie unter Angefügte Eigenschaften.
Hinzufügen von Erweiterungsmethoden
Erweiterungsmethoden müssen plattformspezifisch Shadow
hinzugefügt werden, um den Verbrauch über eine Fluent-Code-API zu ermöglichen:
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;
}
...
}
}
Die IsShadowed
Methoden und SetIsShadowed
Erweiterungsmethoden rufen die Get- bzw. Set-Accessoren für die IsShadowed
angefügte Eigenschaft auf. Jede Erweiterungsmethode wird auf dem IPlatformElementConfiguration<iOS, FormsElement>
Typ ausgeführt, der angibt, dass die plattformspezifischen Instanzen von iOS aufgerufen Label
werden können.
Erstellen des Effekts
Die Shadow
plattformspezifische Add-Ins MyCompany.LabelShadowEffect
zu einem Label
, und entfernt sie. Im folgenden Codebeispiel wird die Implementierung von LabelShadowEffect
für das iOS-Projekt veranschaulicht:
[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);
}
}
}
}
Die UpdateShadow
Methode legt Control.Layer
Eigenschaften fest, um den Schatten zu erstellen, vorausgesetzt, die IsShadowed
angefügte Eigenschaft ist auf festgelegt true
und vorausgesetzt, dass die Shadow
plattformspezifische Auf der gleichen Plattform aufgerufen wurde, für die der Effekt implementiert ist. Diese Überprüfung wird mit der OnThisPlatform
Methode durchgeführt.
Wenn sich der Wert der Shadow.IsShadowed
angefügten Eigenschaft zur Laufzeit ändert, muss der Effekt reagieren, indem der Schatten entfernt wird. Daher wird eine überschriebene Version der Methode verwendet, um auf die Änderung der OnElementPropertyChanged
bindungsfähigen Eigenschaft durch Aufrufen der UpdateShadow
Methode zu reagieren.
Weitere Informationen zum Erstellen eines Effekts finden Sie unter Erstellen eines Effekts und Übergeben von Effektparametern als angefügte Eigenschaften.
Nutzen der plattformspezifischen
Die Shadow
plattformspezifischen Daten werden in XAML verwendet, indem die Shadow.IsShadowed
angefügte Eigenschaft auf einen boolean
Wert festgelegt wird:
<ContentPage xmlns:ios="clr-namespace:MyCompany.Forms.PlatformConfiguration.iOS" ...>
...
<Label Text="Label Shadow Effect" ios:Shadow.IsShadowed="true" ... />
...
</ContentPage>
Alternativ kann es auch von C# aus über die Fluent-API genutzt werden:
using Xamarin.Forms.PlatformConfiguration;
using MyCompany.Forms.PlatformConfiguration.iOS;
...
shadowLabel.On<iOS>().SetIsShadowed(true);