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:
- sınıfını alt sınıfa
RoutingEffect
alan birpublic
sınıf oluşturun. sınıfı,RoutingEffect
genellikle platforma özgü bir iç efekti sarmalayan platformdan bağımsız bir efekti temsil eder. - Çö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.
- 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:
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:
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ü LabelShadowEffect
her 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 ShadowEffect
Effects
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 Label
bazı düzen özellikleri ayarlar. Ardından, rengini ve konumunu denetlemek için , TranslationX
ve TranslationY
özelliklerini ayarlayarak TextColor
gölgeyi Label
oluş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.