Aracılığıyla paylaş


Efekt Parametrelerini Ortak Dil Çalışma Zamanı Özellikleri Olarak Geçirme

Ortak Dil Çalışma Zamanı (CLR) özellikleri, çalışma zamanı özellik değişikliklerine yanıt vermeyen efekt parametrelerini tanımlamak için kullanılabilir. Bu makalede, parametreleri bir efekte geçirmek için CLR özelliklerini kullanma gösterilmektedir.

Çalışma zamanı özellik değişikliklerine yanıt vermeyen efekt parametreleri oluşturma işlemi aşağıdaki gibidir:

  1. sınıfını alt sınıfa RoutingEffect alan bir public sınıf oluşturun. sınıfı, RoutingEffect genellikle platforma özgü bir iç efekti sarmalayan platformdan bağımsız bir efekti temsil eder.
  2. Çözüm grubu adının ve platforma özgü her efekt sınıfında belirtilen benzersiz kimliğin bir birleştirmesini geçirerek temel sınıf oluşturucuyu çağıran bir oluşturucu oluşturun.
  3. Etkisine geçirilecek her parametre için sınıfına özellikler ekleyin.

Ardından, efektin örneğini oluştururken her özellik için değerler belirtilerek parametreler efekte geçirilebilir.

Örnek uygulama, denetim ShadowEffect tarafından görüntülenen metne gölge ekleyen bir Label gösterir. Aşağıdaki diyagramda, örnek uygulamadaki her projenin sorumlulukları ve aralarındaki ilişkiler gösterilmektedir:

Gölge Efekti Proje Sorumlulukları

Label üzerindeki HomePage bir denetim, platforma özgü her projede tarafından LabelShadowEffect özelleştirilir. Parametreler sınıfındaki özellikler aracılığıyla her LabelShadowEffect birine ShadowEffect geçirilir. Her LabelShadowEffect sınıf, her platform için sınıfından PlatformEffect türetilir. Bu, aşağıdaki ekran görüntülerinde gösterildiği gibi denetim tarafından görüntülenen metne Label gölge eklenmesine neden olur:

Her Platformda Gölge Efekti

Efekt Parametreleri Oluşturma

public Aşağıdaki kod örneğinde RoutingEffect gösterildiği gibi, etki parametrelerini temsil etmek için sınıfı alt sınıflayan bir sınıf oluşturulmalıdır:

public class ShadowEffect : RoutingEffect
{
  public float Radius { get; set; }

  public Color Color { get; set; }

  public float DistanceX { get; set; }

  public float DistanceY { get; set; }

  public ShadowEffect () : base ("MyCompany.LabelShadowEffect")
  {            
  }
}

, ShadowEffect platforma özgü LabelShadowEffecther birine geçirilecek parametreleri temsil eden dört özellik içerir. Sınıf oluşturucu, çözüm grubu adının birleştirilmiş öğesinden oluşan bir parametreyi ve platforma özgü her efekt sınıfında belirtilen benzersiz kimliği geçirerek temel sınıf oluşturucuyu çağırır. Bu nedenle, örneğini MyCompany.LabelShadowEffect oluşturduğunda yeni bir örneği denetimin Effects koleksiyonuna ShadowEffect eklenir.

Efekti Kullanma

Aşağıdaki XAML kodu örneği, öğesinin ShadowEffect eklendiği bir Label denetimi gösterir:

<Label Text="Label Shadow Effect" ...>
  <Label.Effects>
    <local:ShadowEffect Radius="5" DistanceX="5" DistanceY="5">
      <local:ShadowEffect.Color>
        <OnPlatform x:TypeArguments="Color">
            <On Platform="iOS" Value="Black" />
            <On Platform="Android" Value="White" />
            <On Platform="UWP" Value="Red" />
        </OnPlatform>
      </local:ShadowEffect.Color>
    </local:ShadowEffect>
  </Label.Effects>
</Label>

C# ile eşdeğeri Label aşağıdaki kod örneğinde gösterilmiştir:

var label = new Label {
  Text = "Label Shadow Effect",
  ...
};

Color color = Color.Default;
switch (Device.RuntimePlatform)
{
    case Device.iOS:
        color = Color.Black;
        break;
    case Device.Android:
        color = Color.White;
        break;
    case Device.UWP:
        color = Color.Red;
        break;
}

label.Effects.Add (new ShadowEffect {
  Radius = 5,
  Color = color,
  DistanceX = 5,
  DistanceY = 5
});

Her iki kod örneğinde de sınıfın bir örneği, denetimin ShadowEffectEffects koleksiyonuna eklenmeden önce her özellik için belirtilen değerlerle oluşturulur. özelliğinde platforma ShadowEffect.Color özgü renk değerlerinin kullanıldığına dikkat edin. Daha fazla bilgi için bkz . Cihaz Sınıfı.

Her Platformda Etki Oluşturma

Aşağıdaki bölümlerde sınıfın platforma özgü uygulaması LabelShadowEffect açıklanmıştır.

iOS Projesi

Aşağıdaki kod örneği, iOS projesinin uygulamasını gösterir LabelShadowEffect :

[assembly:ResolutionGroupName ("MyCompany")]
[assembly:ExportEffect (typeof(LabelShadowEffect), "LabelShadowEffect")]
namespace EffectsDemo.iOS
{
    public class LabelShadowEffect : PlatformEffect
    {
        protected override void OnAttached ()
        {
            try {
                var effect = (ShadowEffect)Element.Effects.FirstOrDefault (e => e is ShadowEffect);
                if (effect != null) {
                    Control.Layer.ShadowRadius = effect.Radius;
                    Control.Layer.ShadowColor = effect.Color.ToCGColor ();
                    Control.Layer.ShadowOffset = new CGSize (effect.DistanceX, effect.DistanceY);
                    Control.Layer.ShadowOpacity = 1.0f;
                }
            } catch (Exception ex) {
                Console.WriteLine ("Cannot set property on attached control. Error: ", ex.Message);
            }
        }

        protected override void OnDetached ()
        {
        }
    }
}

OnAttached yöntemi örneği alır ShadowEffect ve gölgeyi oluşturmak için özellikleri belirtilen özellik değerlerine ayarlarControl.Layer. Efektin eklendiği denetimin özelliklere sahip olmaması durumunda bu işlev bir try/catch blokta Control.Layer sarmalanır. Temizleme gerekli olmadığından yöntemi tarafından OnDetached hiçbir uygulama sağlanmadı.

Android Projesi

Aşağıdaki kod örneği, Android projesinin uygulamasını gösterir LabelShadowEffect :

[assembly:ResolutionGroupName ("MyCompany")]
[assembly:ExportEffect (typeof(LabelShadowEffect), "LabelShadowEffect")]
namespace EffectsDemo.Droid
{
    public class LabelShadowEffect : PlatformEffect
    {
        protected override void OnAttached ()
        {
            try {
                var control = Control as Android.Widget.TextView;
                var effect = (ShadowEffect)Element.Effects.FirstOrDefault (e => e is ShadowEffect);
                if (effect != null) {
                    float radius = effect.Radius;
                    float distanceX = effect.DistanceX;
                    float distanceY = effect.DistanceY;
                    Android.Graphics.Color color = effect.Color.ToAndroid ();
                    control.SetShadowLayer (radius, distanceX, distanceY, color);
                }
            } catch (Exception ex) {
                Console.WriteLine ("Cannot set property on attached control. Error: ", ex.Message);
            }
        }

        protected override void OnDetached ()
        {
        }
    }
}

OnAttached yöntemi örneği alır ShadowEffect ve belirtilen özellik değerlerini kullanarak gölge oluşturmak için yöntemini çağırırTextView.SetShadowLayer. Efektin eklendiği denetimin özelliklere sahip olmaması durumunda bu işlev bir try/catch blokta Control.Layer sarmalanır. Temizleme gerekli olmadığından yöntemi tarafından OnDetached hiçbir uygulama sağlanmadı.

Evrensel Windows Platformu Projesi

Aşağıdaki kod örneği, Evrensel Windows Platformu (UWP) projesinin uygulamasını gösterirLabelShadowEffect:

[assembly: ResolutionGroupName ("Xamarin")]
[assembly: ExportEffect (typeof(LabelShadowEffect), "LabelShadowEffect")]
namespace EffectsDemo.UWP
{
    public class LabelShadowEffect : PlatformEffect
    {
        bool shadowAdded = false;

        protected override void OnAttached ()
        {
            try {
                if (!shadowAdded) {
                    var effect = (ShadowEffect)Element.Effects.FirstOrDefault (e => e is ShadowEffect);
                    if (effect != null) {
                        var textBlock = Control as Windows.UI.Xaml.Controls.TextBlock;
                        var shadowLabel = new Label ();
                        shadowLabel.Text = textBlock.Text;
                        shadowLabel.FontAttributes = FontAttributes.Bold;
                        shadowLabel.HorizontalOptions = LayoutOptions.Center;
                        shadowLabel.VerticalOptions = LayoutOptions.CenterAndExpand;
                        shadowLabel.TextColor = effect.Color;
                        shadowLabel.TranslationX = effect.DistanceX;
                        shadowLabel.TranslationY = effect.DistanceY;

                        ((Grid)Element.Parent).Children.Insert (0, shadowLabel);
                        shadowAdded = true;
                    }
                }
            } catch (Exception ex) {
                Debug.WriteLine ("Cannot set property on attached control. Error: ", ex.Message);
            }
        }

        protected override void OnDetached ()
        {
        }
    }
}

Evrensel Windows Platformu bir gölge efekti sağlamaz ve bu nedenle her iki platformdaki uygulama birincil Labelöğesinin LabelShadowEffect arkasına ikinci bir uzaklık Label ekleyerek bir benzetim oluşturur. OnAttached yöntemi örneği alırShadowEffect, yeni Labelöğesini oluşturur ve üzerinde Labelbazı düzen özellikleri ayarlar. Ardından, rengini ve konumunu denetlemek için , TranslationXve TranslationY özelliklerini ayarlayarak TextColorgölgeyi Labeloluşturur. shadowLabel ardından, birincil Labelöğesinin arkasına uzaklık eklenir. Efektin eklendiği denetimin özelliklere sahip olmaması durumunda bu işlev bir try/catch blokta Control.Layer sarmalanır. Temizleme gerekli olmadığından yöntemi tarafından OnDetached hiçbir uygulama sağlanmadı.

Özet

Bu makalede, parametreleri bir efekte geçirmek için CLR özelliklerinin kullanıldığı gösterilmiştir. CLR özellikleri, çalışma zamanı özellik değişikliklerine yanıt vermeyen efekt parametrelerini tanımlamak için kullanılabilir.