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:
- Buat
public
kelas yang mensubkelasRoutingEffect
kelas. Kelas iniRoutingEffect
mewakili efek independen platform yang membungkus efek dalam yang biasanya khusus platform. - Buat konstruktor yang memanggil konstruktor kelas dasar, meneruskan perangkaian nama grup resolusi, dan ID unik yang ditentukan pada setiap kelas efek khusus platform.
- 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:
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:
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 LabelShadowEffect
platform . 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 ShadowEffect
Label
, membuat baru , dan mengatur beberapa properti tata letak pada Label
. Kemudian membuat bayangan dengan mengatur TextColor
properti , 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.