Bagikan melalui


Parameter Efek Passing sebagai Properti Runtime Bahasa Umum

Properti Common Language Runtime (CLR) dapat digunakan untuk menentukan parameter efek yang tidak merespons perubahan properti runtime. Artikel ini menunjukkan penggunaan properti CLR untuk meneruskan parameter ke efek.

Proses untuk membuat parameter efek yang tidak merespons perubahan properti runtime adalah sebagai berikut:

  1. Buat public kelas yang mensubkelas RoutingEffect kelas. Kelas ini RoutingEffect mewakili efek independen platform yang membungkus efek dalam yang biasanya khusus platform.
  2. Buat konstruktor yang memanggil konstruktor kelas dasar, meneruskan perangkaian nama grup resolusi, dan ID unik yang ditentukan pada setiap kelas efek khusus platform.
  3. Tambahkan properti ke kelas untuk setiap parameter yang akan diteruskan ke efek .

Parameter kemudian dapat diteruskan ke efek dengan menentukan nilai untuk setiap properti saat membuat instans efek.

Aplikasi sampel menunjukkan ShadowEffect yang menambahkan bayangan ke teks yang Label ditampilkan oleh kontrol. Diagram berikut mengilustrasikan tanggung jawab setiap proyek dalam aplikasi sampel, bersama dengan hubungan di antara mereka:

Tanggung Jawab Proyek Efek Bayangan

Label Kontrol pada HomePage disesuaikan oleh LabelShadowEffect di setiap proyek khusus platform. Parameter diteruskan ke setiap LabelShadowEffect properti melalui di ShadowEffect kelas . Setiap LabelShadowEffect kelas berasal dari PlatformEffect kelas untuk setiap platform. Ini menghasilkan bayangan yang ditambahkan ke teks yang ditampilkan oleh Label kontrol, seperti yang ditunjukkan pada cuplikan layar berikut:

Efek Bayangan pada setiap Platform

Membuat Parameter Efek

Kelas public yang mensubkelas RoutingEffect kelas harus dibuat untuk mewakili parameter efek, seperti yang ditunjukkan dalam contoh kode berikut:

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 berisi empat properti yang mewakili parameter yang akan diteruskan ke setiap platform khusus LabelShadowEffectplatform . Konstruktor kelas memanggil konstruktor kelas dasar, meneruskan parameter yang terdiri dari perangkaian nama grup resolusi, dan ID unik yang ditentukan pada setiap kelas efek khusus platform. Oleh karena itu, instans MyCompany.LabelShadowEffect baru akan ditambahkan ke koleksi kontrol Effects saat ShadowEffect dibuat.

Mengkonsumsi Efek

Contoh kode XAML berikut menunjukkan Label kontrol yang ShadowEffect dilampirkan:

<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>

Yang setara Label dalam C# ditunjukkan dalam contoh kode berikut:

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
});

Dalam kedua contoh kode, instans ShadowEffect kelas dibuat dengan nilai yang ditentukan untuk setiap properti, sebelum ditambahkan ke koleksi kontrol Effects . Perhatikan bahwa ShadowEffect.Color properti menggunakan nilai warna khusus platform. Untuk informasi selengkapnya, lihat Kelas Perangkat.

Membuat Efek pada setiap Platform

Bagian berikut membahas implementasi LabelShadowEffect kelas khusus platform.

Proyek iOS

Contoh kode berikut menunjukkan LabelShadowEffect implementasi untuk proyek iOS:

[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 ()
        {
        }
    }
}

Metode mengambil OnAttached instans ShadowEffect , dan mengatur Control.Layer properti ke nilai properti yang ditentukan untuk membuat bayangan. Fungsionalitas ini dibungkus dalam try/catch blok jika kontrol yang dilampirkan efek tidak memiliki Control.Layer properti . Tidak ada implementasi yang disediakan oleh OnDetached metode karena tidak diperlukan pembersihan.

Proyek Android

Contoh kode berikut menunjukkan LabelShadowEffect implementasi untuk proyek Android:

[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 ()
        {
        }
    }
}

Metode mengambil OnAttached instans ShadowEffect , dan memanggil TextView.SetShadowLayer metode untuk membuat bayangan menggunakan nilai properti yang ditentukan. Fungsionalitas ini dibungkus dalam try/catch blok jika kontrol yang dilampirkan efek tidak memiliki Control.Layer properti . Tidak ada implementasi yang disediakan oleh OnDetached metode karena tidak diperlukan pembersihan.

Proyek Platform Windows Universal

Contoh kode berikut menunjukkan LabelShadowEffect implementasi untuk proyek Platform Windows Universal (UWP):

[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 ()
        {
        }
    }
}

Platform Windows Universal tidak memberikan efek bayangan, sehingga LabelShadowEffect implementasi pada kedua platform mensimulasikan satu dengan menambahkan offset Label kedua di belakang primer Label. Metode mengambil OnAttached instans ShadowEffectLabel, membuat baru , dan mengatur beberapa properti tata letak pada Label. Kemudian membuat bayangan dengan mengatur TextColorproperti , TranslationX, dan TranslationY untuk mengontrol warna dan lokasi Label. shadowLabel kemudian dimasukkan offset di belakang primer Label. Fungsionalitas ini dibungkus dalam try/catch blok jika kontrol yang dilampirkan efek tidak memiliki Control.Layer properti . Tidak ada implementasi yang disediakan oleh OnDetached metode karena tidak diperlukan pembersihan.

Ringkasan

Artikel ini telah menunjukkan penggunaan properti CLR untuk meneruskan parameter ke efek. Properti CLR dapat digunakan untuk menentukan parameter efek yang tidak merespons perubahan properti runtime.