Předání parametrů účinku jako vlastností modulu CLR (Common Language Runtime)

Ukázka stažení Stažení ukázky

Vlastnosti modulu CLR (Common Language Runtime) lze použít k definování parametrů efektu, které nereagují na změny vlastností za běhu. Tento článek ukazuje použití vlastností CLR k předání parametrů efektu.

Proces vytváření parametrů efektu, který nereaguje na změny vlastností za běhu, je následující:

  1. Vytvořte public třídu, která podtřídí RoutingEffect třídu. RoutingEffectTřída představuje efekt nezávislý na platformě, který zabalí vnitřní efekt, který je obvykle specifický pro platformu.
  2. Vytvořte konstruktor, který volá konstruktor základní třídy, předejte zřetězení názvu skupiny rozlišení a jedinečné ID, které bylo zadáno v každé třídě účinku specifického pro platformu.
  3. Přidejte do třídy vlastnosti pro každý parametr, který má být předán efektu.

Parametry lze následně předat účinku zadáním hodnot pro každou vlastnost při vytváření instance efektu.

Ukázková aplikace ukazuje ShadowEffect , že přidá stín k textu zobrazovanému Label ovládacím prvkem. Následující diagram znázorňuje zodpovědnosti každého projektu v ukázkové aplikaci společně se vztahy mezi nimi:

efekt stínu Project odpovědností

LabelOvládací prvek v HomePage je přizpůsoben LabelShadowEffect v každém projektu specifickém pro platformu. Parametry jsou předány do každého LabelShadowEffect prostřednictvím vlastností ve ShadowEffect třídě. Každá LabelShadowEffect Třída je odvozena od PlatformEffect třídy pro každou platformu. Výsledkem je, že se stín přidá do textu zobrazeného Label ovládacím prvkem, jak je znázorněno na následujících snímcích obrazovky:

Efekt stínu na každé platformě

Vytváření parametrů efektu

publicTřída, která RoutingEffect podtříd třídy musí být vytvořena, aby představovala parametry účinku, jak je znázorněno v následujícím příkladu kódu:

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")
  {            
  }
}

ShadowEffectObsahuje čtyři vlastnosti, které reprezentují parametry, které mají být předány jednotlivým specifickým platformám LabelShadowEffect . Konstruktor třídy volá konstruktor základní třídy, který předává parametr skládající se z zřetězení názvu skupiny rozlišení a jedinečné ID, které bylo zadáno v každé třídě účinku specifického pro platformu. Proto bude nová instance MyCompany.LabelShadowEffect přidána do Xamarin_Forms ovládacího prvku MyCompany.LabelShadowEffect _Element_Effects "data-LINKTYPE =" absolutní cesta ">Effects kolekce při ShadowEffect vytvoření instance.

Využívání efektu

Následující příklad kódu XAML ukazuje Label ovládací prvek, ke kterému ShadowEffect je připojen:

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

Ekvivalent Label v jazyce C# je zobrazen v následujícím příkladu kódu:

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

V obou příkladech kódu ShadowEffect je instance třídy vytvořena s hodnotami, které jsou zadány pro každou vlastnost, před přidáním do Xamarin_Forms ovládacího prvku ShadowEffect _Element_Effects "data-LINKTYPE =" absolutní cesta ">Effects kolekce. Všimněte si, že ShadowEffect.Color vlastnost používá hodnoty barvy specifické pro platformu. Další informace najdete v tématu Třída zařízení.

Vytvoření efektu na každé platformě

Následující části popisují implementaci třídy specifické pro platformu LabelShadowEffect .

Project pro iOS

Následující příklad kódu ukazuje LabelShadowEffect implementaci pro projekt 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 ()
        {
        }
    }
}

OnAttachedMetoda načte ShadowEffect instanci a nastaví Control.Layer vlastnosti na zadané hodnoty vlastností, aby bylo možné vytvořit stín. Tato funkce je zabalena v try/catch bloku pro případ, že ovládací prvek, ke kterému je připojen efekt, nemá Control.Layer Vlastnosti. Metoda neposkytuje žádnou implementaci, OnDetached protože není nutné žádné vyčištění.

Project pro Android

Následující příklad kódu ukazuje LabelShadowEffect implementaci pro projekt pro 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 ()
        {
        }
    }
}

OnAttachedMetoda načte ShadowEffect instanci a zavolá TextView.SetShadowLayer metodu pro vytvoření stínu pomocí zadaných hodnot vlastností. Tato funkce je zabalena v try/catch bloku pro případ, že ovládací prvek, ke kterému je připojen efekt, nemá Control.Layer Vlastnosti. Metoda neposkytuje žádnou implementaci, OnDetached protože není nutné žádné vyčištění.

Univerzální platforma Windows Project

následující příklad kódu ukazuje LabelShadowEffect implementaci projektu Univerzální platforma Windows (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 ()
        {
        }
    }
}

Univerzální platforma Windows neposkytuje stínový efekt, takže LabelShadowEffect implementace na obou platformách simuluje jeden přidáním druhého posunu Label za primární Label . OnAttachedMetoda načte ShadowEffect instanci, vytvoří nový Label a nastaví některé vlastnosti rozložení na Label . Potom vytvoří stín nastavením _Label_TextColor "data-LINKTYPE =" absolutní cesta ">TextColor , TextColor Xamarin_Forms _VisualElement_TranslationX data-LINKTYPE =" absolutní cesta ">TranslationX a Xamarin_Forms _VisualElement_TranslationY " data-LINKTYPE = "absolutní cesta" >TranslationY vlastnosti, aby bylo možné řídit barvu a umístění Label . shadowLabelPak se vloží posun za primární Label . Tato funkce je zabalena v try/catch bloku pro případ, že ovládací prvek, ke kterému je připojen efekt, nemá Control.Layer Vlastnosti. Metoda neposkytuje žádnou implementaci, OnDetached protože není nutné žádné vyčištění.

Souhrn

Tento článek ukázal použití vlastností CLR k předání parametrů efektu. Vlastnosti CLR lze použít k definování parametrů efektu, které nereagují na změny vlastností za běhu.