Platforma Özgü Özellikler
Platform özellikleri, özel oluşturuculara veya etkilere uygulamadan yalnızca belirli bir platformda kullanılabilir olan işlevleri kullanmanıza olanak sağlar.
XAML aracılığıyla veya akıcı kod API 'SI aracılığıyla platforma özgü bir işlem kullanma işlemi aşağıdaki gibidir:
xmlnsusingAd alanı için bir bildirim veya yönerge ekleyinXamarin.Forms.PlatformConfiguration.xmlnsusingPlatforma özgü işlevselliği içeren ad alanı için bir bildirim veya yönerge ekleyin:- İOS 'ta, bu
Xamarin.Forms.PlatformConfiguration.iOSSpecificad alanıdır. - Android 'de, bu
Xamarin.Forms.PlatformConfiguration.AndroidSpecificad alanıdır. Android AppCompat için buXamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompatad alanıdır. - Evrensel Windows Platformu, bu
Xamarin.Forms.PlatformConfiguration.WindowsSpecificad alanıdır.
- İOS 'ta, bu
- XAML 'den veya Fluent API koddan bir platforma özel uygulama uygulayın
On<T>. Değeri,TiOSAndroidWindowsad alanındaki, veya türleri olabilirXamarin.Forms.PlatformConfiguration.
Not
Bir platformda, bir platforma özgü, kullanılamayan bir platformda kullanmaya çalışan bir hataya neden olmaz. Bunun yerine, bu kod, platforma özgü uygulanmamış olmadan yürütülür.
On<T>Akıcı kod API 'si döndürme nesneleri aracılığıyla tüketilen platform özellikleri IPlatformElementConfiguration . Bu, yöntemi geçişli bir nesne üzerinde birden çok platform özelliklerinin çağrılmasını sağlar.
tarafından sunulan platform özellikleri hakkında daha fazla bilgi için Xamarin.Forms bkz. Xamarin.Forms, Android platform-özelliklerive Windows platform-özellikleri.
Platform oluşturma-Ayrıntılar
Satıcılar, etkileri olan kendi platform özelliklerini oluşturabilir. Bir efekt, daha sonra platforma özel olarak ortaya çıkarılan belirli işlevleri sağlar. Sonuç olarak, XAML aracılığıyla daha kolay bir şekilde tüketilen ve akıcı bir kod API 'SI aracılığıyla bir etkisi olur.
Platforma özgü oluşturma işlemi aşağıdaki gibidir:
- Belirli işlevselliği bir efekt olarak uygulayın. Daha fazla bilgi için bkz. efekt oluşturma.
- Efekti açığa çıkarmak için platforma özgü bir sınıf oluşturun. Daha fazla bilgi için bkz. Platform-Specific sınıfı oluşturma.
- Platforma özgü sınıfta, platforma özgü XAML aracılığıyla kullanılmasına izin vermek için iliştirilmiş bir özellik uygulayın. Daha fazla bilgi için bkz. ekli özellik ekleme.
- Platforma özgü sınıfta, platforma özgü kod API 'SI aracılığıyla kullanılmasına izin vermek için uzantı yöntemleri uygulayın. Daha fazla bilgi için bkz. Uzantı yöntemleri ekleme.
- Efekt uygulamasını, etkile aynı platformda yalnızca platforma özgü çağrılırsa uygulanabilmesi için değiştirin. Daha fazla bilgi için bkz. etkiyi oluşturma.
Bir etkiyi platforma özgü olarak gösterme sonucu, efektin XAML aracılığıyla daha kolay ve akıcı bir kod API 'SI aracılığıyla daha kolay bir şekilde tüketilebilmesi olacaktır.
Not
Bu teknik, satıcıların kullanıcılara göre tüketim kolaylığı için kendi platform özelliklerini oluşturmak üzere bu tekniği kullanmasını sağlar. Kullanıcılar kendi platform özelliklerini oluşturmayı seçebileceğinden, bir efekt oluşturmaktan ve tükettikten daha fazla kod gerektirdiğini not edilmelidir.
Örnek uygulama , bir Denetim tarafından görüntülenen metne gölge ekleyen platforma özel gösterir Label :

Örnek uygulama , her platformda, daha kolay anlaşılması için platforma özgü platformu uygular. Ancak, platforma özgü her efekt uygulamasından ayrı olarak, her platformda gölge sınıfın uygulanması büyük ölçüde aynıdır. Bu nedenle, bu kılavuz, tek bir platformda gölge sınıfının ve ilişkili efektin uygulanması üzerinde odaklanmıştır.
Etkiler hakkında daha fazla bilgi için bkz. denetimleri efektlerle özelleştirme.
Platforma özgü sınıf oluşturma
Platforma özgü bir sınıf olarak oluşturulur public static :
namespace MyCompany.Forms.PlatformConfiguration.iOS
{
public static Shadow
{
...
}
}
Aşağıdaki bölümler, Shadow platforma özgü ve Ilişkili efektin uygulanmasını tartışır.
Ekli Özellik Ekleme
ShadowXaml üzerinden tüketime izin vermek için platforma özel iliştirilmiş bir ö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İliştirilmiş özelliği, MyCompany.LabelShadowEffect sınıfının eklendiği denetim, öğesinden öğesine efekt eklemek ve öğesinden kaldırmak için kullanılır Shadow . Bu iliştirilmiş özelliği, OnIsShadowedPropertyChanged özelliğin değeri değiştiğinde yürütülecek yöntemi kaydeder. Buna karşılık, bu yöntem AttachEffectDetachEffect eklenen özelliğin değerine göre efekt eklemek veya kaldırmak için veya yöntemini çağırır IsShadowed . Etki, denetimin Xamarin_Forms "Data-LinkType =" Absolute-path ">koleksiyonu _Element_Effects değiştirilerek denetime eklenir veya denetimden kaldırılır Effects .
Not
Efektinin, çözüm grubu adının ve etki üzerinde belirtilen benzersiz tanımlayıcının birleşimi olan bir değer belirtilerek çözümlendiğine 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
ShadowAkıcı bir kod API 'si aracılığıyla tüketimine 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;
}
...
}
}
IsShadowedVe SetIsShadowed genişletme yöntemleri, ekli özellik için sırasıyla get ve set erişimcileri çağırır IsShadowed . Her genişletme yöntemi tür üzerinde çalışır IPlatformElementConfiguration<iOS, FormsElement> ve bu, platforma özgü, Label iOS tarafından örneklerle çağrılabileceğini belirtir.
Efekti oluşturma
ShadowPlatforma özgü MyCompany.LabelShadowEffect öğesini öğesine ekler Label ve kaldırır. Aşağıdaki kod örneğinde LabelShadowEffect iOS projesi için uygulama gösterilmektedir:
[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);
}
}
}
}
UpdateShadowYöntemi, Control.LayerIsShadowed iliştirilmiş özelliğin olarak ayarlandığı true ve Shadow platforma özgü, efektin uygulandığı aynı platformda çağrılması şartıyla, gölgeyi oluşturmak için özellikleri ayarlar. Bu denetim OnThisPlatform yöntemiyle gerçekleştirilir.
Shadow.IsShadowedİliştirilmiş özellik değeri çalışma zamanında değişirse, efektin gölge kaldırılarak yanıt vermesi gerekir. Bu nedenle, yönteminin geçersiz kılınabilen bir sürümü OnElementPropertyChanged yöntemini çağırarak bağlanabilir Özellik değişikliğine yanıt vermek için kullanılır UpdateShadow .
Efekt oluşturma hakkında daha fazla bilgi için bkz. efekt oluşturma ve efekt parametrelerini Iliştirilmiş özellikler olarak geçirme.
Platforma özgü
ShadowPlatforma özgü, Shadow.IsShadowed iliştirilmiş özelliği bir değere ayarlayarak xaml 'de kullanılır boolean :
<ContentPage xmlns:ios="clr-namespace:MyCompany.Forms.PlatformConfiguration.iOS" ...>
...
<Label Text="Label Shadow Effect" ios:Shadow.IsShadowed="true" ... />
...
</ContentPage>
Alternatif olarak, Fluent API kullanarak C# üzerinden de kullanılabilir:
using Xamarin.Forms.PlatformConfiguration;
using MyCompany.Forms.PlatformConfiguration.iOS;
...
shadowLabel.On<iOS>().SetIsShadowed(true);
Örneği indirin