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:

  1. Ad alanı için Xamarin.Forms.PlatformConfiguration bir xmlns bildirim veya using yönerge ekleyin.
  2. Platforma özgü işlevselliği içeren ad alanı için bir xmlns bildirim veya using yönerge ekleyin:
    1. iOS'ta bu ad alanıdır Xamarin.Forms.PlatformConfiguration.iOSSpecific .
    2. Android'de bu ad alanıdır Xamarin.Forms.PlatformConfiguration.AndroidSpecific . Android AppCompat için bu ad alanıdır Xamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat .
    3. Evrensel Windows Platformu bu ad alanıdırXamarin.Forms.PlatformConfiguration.WindowsSpecific.
  3. XAML'den veya akıcı API ile koddan platforma On<T> özgü uygulama. değeriT, ad alanından , Androidveya Windows türleri Xamarin.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:

  1. Belirli bir işlevi Efekt olarak uygulayın. Daha fazla bilgi için bkz . Efekt Oluşturma.
  2. Efekti ortaya çıkaracak platforma özgü bir sınıf oluşturun. Daha fazla bilgi için bkz . Platforma Özgü Sınıf Oluşturma.
  3. 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.
  4. 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.
  5. 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:

Gölge Platforma Özgü

Ö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ı trueve 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);