Platforma Özgü Özellikler
Platforma özgü özellikler, özel işleyiciler veya efektler uygulamadan yalnızca belirli bir platformda kullanılabilen işlevleri kullanmanıza olanak sağlar.
Platforma özgü bir XAML veya akıcı kod API'sini kullanma işlemi aşağıdaki gibidir:
- Ad alanı için
Xamarin.Forms.PlatformConfiguration
birxmlns
bildirim veyausing
yönerge ekleyin. - Platforma özgü işlevselliği içeren ad alanı için bir
xmlns
bildirim veyausing
yönerge ekleyin:- iOS'ta bu ad alanıdır
Xamarin.Forms.PlatformConfiguration.iOSSpecific
. - Android'de bu ad alanıdır
Xamarin.Forms.PlatformConfiguration.AndroidSpecific
. Android AppCompat için bu ad alanıdırXamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat
. - Evrensel Windows Platformu bu ad alanıdır
Xamarin.Forms.PlatformConfiguration.WindowsSpecific
.
- iOS'ta bu ad alanıdır
- XAML'den veya akıcı API ile koddan platforma
On<T>
özgü uygulama. değeriT
, ad alanından ,Android
veyaWindows
türleriXamarin.Forms.PlatformConfiguration
olabiliriOS
.
Not
Kullanılamadığı bir platformda platforma özgü bir kullanım girişiminin hataya neden olmadığını unutmayın. Bunun yerine kod, platforma özgü uygulanmadan yürütülür.
Akıcı kod API'sinde On<T>
kullanılan platforma özgü özellikler nesneleri döndürür IPlatformElementConfiguration
. Bu, yöntem basamaklı olarak aynı nesne üzerinde birden çok platforma özgü özelliğin çağrılmasını sağlar.
tarafından Xamarin.Formssağlanan platforma özgü özellikler hakkında daha fazla bilgi için bkz . iOS Platforma Özgü Özellikler, Android Platforma Özgü Özellikler ve Windows Platformu Özellikleri.
Platforma özgü özellikler oluşturma
Satıcılar Efektler ile kendi platforma özgü özellikleri oluşturabilir. Efekt, platforma özgü bir işlev aracılığıyla kullanıma sunulan belirli işlevleri sağlar. Sonuç, XAML aracılığıyla ve akıcı bir kod API'si aracılığıyla daha kolay tüketilebilen bir Efekttir.
Platforma özgü bir oluşturma işlemi aşağıdaki gibidir:
- Belirli bir işlevi Efekt olarak uygulayın. Daha fazla bilgi için bkz . Efekt Oluşturma.
- Efekti ortaya çıkaracak platforma özgü bir sınıf oluşturun. Daha fazla bilgi için bkz . Platforma Özgü Sınıf Oluşturma.
- Platforma özgü sınıfında, platforma özgü öğesinin XAML aracılığıyla tüketilmesine izin vermek için ekli bir özellik uygulayın. Daha fazla bilgi için bkz . Ekli Özellik Ekleme.
- Platforma özgü sınıfında, platforma özgü uzantı yöntemlerini uygulayarak akıcı bir kod API'si aracılığıyla tüketilmesine izin verin. Daha fazla bilgi için bkz . Uzantı Yöntemleri Ekleme.
- Efekt uygulamasını, yalnızca platforma özgü efekt ile aynı platformda çağrıldığında uygulanacak şekilde değiştirin. Daha fazla bilgi için bkz . Efekti Oluşturma.
Bir Efekti platforma özgü olarak ortaya çıkarmanın sonucu, Efektin XAML ve akıcı bir kod API'si aracılığıyla daha kolay kullanılabilmesidir.
Not
Satıcıların kullanıcılar tarafından kullanım kolaylığı sağlamak amacıyla kendi platforma özgü özellikleri oluşturmak için bu tekniği kullanması öngörülmektedir. Kullanıcılar kendi platforma özgü özellikleri oluşturmayı seçse de, Efekt oluşturmak ve kullanmaktan daha fazla kod gerektirdiğine dikkat edilmelidir.
Örnek uygulama, bir denetim tarafından görüntülenen metne gölge ekleyen platforma özgü bir Label
uygulama gösterirShadow
:
Örnek uygulama, anlama kolaylığı için her platformda platforma özgü bir uygulama uygular Shadow
. Ancak, platforma özgü her Efekt uygulamasının yanı sıra, Shadow sınıfının uygulanması her platform için büyük ölçüde aynıdır. Bu nedenle, bu kılavuz Shadow sınıfının uygulanmasına ve tek bir platformda ilişkili Efekt'e odaklanır.
Efektler hakkında daha fazla bilgi için bkz . Denetimleri Efektlerle Özelleştirme.
Platforma özgü sınıf oluşturma
Platforma özgü bir public static
sınıf olarak oluşturulur:
namespace MyCompany.Forms.PlatformConfiguration.iOS
{
public static Shadow
{
...
}
}
Aşağıdaki bölümlerde platforma özgü ve ilişkili Efektin Shadow
uygulanması ele alınacaktır.
Ekli özellik ekleme
XAML aracılığıyla tüketime izin vermek için platforma Shadow
özgü bir ekli özellik eklenmelidir:
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);
}
}
}
}
IsShadowed
Ekli özellik, Efekt'i sınıfın MyCompany.LabelShadowEffect
eklendiği denetime Shadow
eklemek ve öğesinden kaldırmak için kullanılır. Bu ekli özellik, özelliğin OnIsShadowedPropertyChanged
değeri değiştiğinde yürütülecek yöntemi kaydeder. Buna karşılık, bu yöntem ekli özelliğin AttachEffect
değerine IsShadowed
göre efekti eklemek veya kaldırmak için veya DetachEffect
yöntemini çağırır. Efekt, denetimin koleksiyonu değiştirilerek denetime eklenir veya denetimden Effects
kaldırılır.
Not
Efekt'in çözüm grubu adının ve Efekt uygulamasında belirtilen benzersiz tanımlayıcının birleştirilmesi olan bir değer belirtilerek çözümlendiğini unutmayın. Daha fazla bilgi için bkz . Efekt Oluşturma.
Ekli özellikler hakkında daha fazla bilgi için bkz . Ekli Özellikler.
Uzantı Yöntemleri Ekleme
Akıcı bir kod API'si Shadow
aracılığıyla tüketime izin vermek için platforma özgü uzantı yöntemleri eklenmelidir:
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;
}
...
}
}
IsShadowed
ve SetIsShadowed
uzantısı yöntemleri, ekli özellik için IsShadowed
sırasıyla get ve set erişimcilerini çağırır. Her uzantı yöntemi, platforma IPlatformElementConfiguration<iOS, FormsElement>
özgü olanın iOS'tan örnekler üzerinde çağrılabileceğini belirten türü üzerinde Label
çalışır.
Efekti oluşturma
Platforma Shadow
özgü bir öğesine Label
öğesini ekler MyCompany.LabelShadowEffect
ve kaldırır. Aşağıdaki kod örneği, iOS projesinin uygulamasını gösterir LabelShadowEffect
:
[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);
}
}
}
}
UpdateShadow
yöntemi, ekli özelliğin IsShadowed
olarak ayarlanması true
ve platforma özgü özelliğin Shadow
Efekt'in uygulandığı platformda çağrılmış olması koşuluyla, gölgeyi oluşturmak için özellikleri ayarlarControl.Layer
. Bu denetim yöntemiyle OnThisPlatform
gerçekleştirilir.
Shadow.IsShadowed
Ekli özellik değeri çalışma zamanında değişirse, Efektin gölgeyi kaldırarak yanıt vermesi gerekir. Bu nedenle, yöntemini çağırarak bağlanabilir özellik değişikliğine yanıt vermek için yönteminin UpdateShadow
geçersiz kılınmış bir sürümü OnElementPropertyChanged
kullanılır.
Efekt oluşturma hakkında daha fazla bilgi için bkz . Efekt Oluşturma ve Efekt Parametrelerini Ekli Özellikler Olarak Geçirme.
Platforma özgü kullanma
Platforma Shadow
özgü XAML'de ekli özellik bir boolean
değere ayarlanarak Shadow.IsShadowed
kullanılır:
<ContentPage xmlns:ios="clr-namespace:MyCompany.Forms.PlatformConfiguration.iOS" ...>
...
<Label Text="Label Shadow Effect" ios:Shadow.IsShadowed="true" ... />
...
</ContentPage>
Alternatif olarak, akıcı API kullanılarak C# dilinden de kullanılabilir:
using Xamarin.Forms.PlatformConfiguration;
using MyCompany.Forms.PlatformConfiguration.iOS;
...
shadowLabel.On<iOS>().SetIsShadowed(true);