可重複使用的 EffectBehavior

Download Sample 下載範例

對於將效果新增至控制項,行為是很實用的方法,可從程式碼後置檔案中移除以定案效果方式處理的程式碼。 本文示範如何建立和使用 Xamarin.Forms 行為,以將效果新增至控件。

概觀

類別 EffectBehavior 是可重複使用 Xamarin.Forms 的自定義行為,會在將行為附加至 控件時,將實例加入 Effect 控件中,並在行為與控件中斷連結時移除 Effect 實例。

您必須將下列行為屬性 (Property) 設定為使用行為:

如需效果的詳細資訊,請參閱效果

注意

EffectBehavior是可位於效果行為範例中的自定義類別,不是的一Xamarin.Forms部分。

建立行為

EffectBehavior 類別衍生自 Behavior<T> 類別,其中 TView。 這表示 EffectBehavior 類別可以附加至任何 Xamarin.Forms 控件。

實作可繫結屬性

EffectBehavior 類別會定義兩個 BindableProperty 執行個體,可在行為附加至控制項時,用來將 Effect 新增至控制項。 下列程式碼範例顯示這些屬性:

public class EffectBehavior : Behavior<View>
{
  public static readonly BindableProperty GroupProperty =
    BindableProperty.Create ("Group", typeof(string), typeof(EffectBehavior), null);
  public static readonly BindableProperty NameProperty =
    BindableProperty.Create ("Name", typeof(string), typeof(EffectBehavior), null);

  public string Group {
    get { return (string)GetValue (GroupProperty); }
    set { SetValue (GroupProperty, value); }
  }

  public string Name {
    get { return(string)GetValue (NameProperty); }
    set { SetValue (NameProperty, value); }
  }
  ...
}

使用 EffectBehavior 時,應該將 Group 屬性 (Property) 設定為值效果的 ResolutionGroupName 屬性 (Attribute) 值。 此外,還應該將 Name 屬性 (Property) 設定為值效果類別的 ExportEffect 屬性 (Attribute) 值。

實作覆寫

EffectBehavior 類別可覆寫 Behavior<T> 類別的 OnAttachedToOnDetachingFrom 方法,如下列程式碼範例所示:

public class EffectBehavior : Behavior<View>
{
  ...
  protected override void OnAttachedTo (BindableObject bindable)
  {
    base.OnAttachedTo (bindable);
    AddEffect (bindable as View);
  }

  protected override void OnDetachingFrom (BindableObject bindable)
  {
    RemoveEffect (bindable as View);
    base.OnDetachingFrom (bindable);
  }
  ...
}

OnAttachedTo 方法會呼叫 AddEffect 方法,並將附加的控制項作為參數傳入,以執行設定作業。 OnDetachingFrom 方法會呼叫 RemoveEffect 方法,並將附加的控制項作為參數傳入,以執行清除作業。

實作行為功能

行為的目的是要在行為附加至控制項時,將 GroupName 屬性中定義的 Effect 新增至控制項,並在行為與控制項中斷連結時移除 Effect。 下列程式碼範例顯示核心行為功能:

public class EffectBehavior : Behavior<View>
{
  ...
  void AddEffect (View view)
  {
    var effect = GetEffect ();
    if (effect != null) {
      view.Effects.Add (GetEffect ());
    }
  }

  void RemoveEffect (View view)
  {
    var effect = GetEffect ();
    if (effect != null) {
      view.Effects.Remove (GetEffect ());
    }
  }

  Effect GetEffect ()
  {
    if (!string.IsNullOrWhiteSpace (Group) && !string.IsNullOrWhiteSpace (Name)) {
      return Effect.Resolve (string.Format ("{0}.{1}", Group, Name));
    }
    return null;
  }
}

執行 AddEffect 方法以回應要附加至控制項的 EffectBehavior,其會接收附加的控制項作為參數。 此方法接著會將擷取的效果新增至控制項的 Effects 集合。 執行 RemoveEffect 方法以回應要從控制項中斷連結的 EffectBehavior,其會接收附加的控制項作為參數。 此方法接著會從控制項的 Effects 集合中移除效果。

GetEffect 方法使用 Effect.Resolve 方法來擷取此Effect。 效果是透過串連 GroupName 屬性值來定位。 如果某個平台不提供效果,則 Effect.Resolve 方法會傳回非 null 值。

使用行為

您可以將 EffectBehavior 類別附加至控制項的 Behaviors 集合,如下列 XAML 程式碼範例所示:

<Label Text="Label Shadow Effect" ...>
  <Label.Behaviors>
    <local:EffectBehavior Group="Xamarin" Name="LabelShadowEffect" />
  </Label.Behaviors>
</Label>

對等的 C# 程式碼會顯示在以下程式碼範例中:

var label = new Label {
  Text = "Label Shadow Effect",
  ...
};
label.Behaviors.Add (new EffectBehavior {
  Group = "Xamarin",
  Name = "LabelShadowEffect"
});

行為的 GroupName 屬性 (Property) 會設定為每個平台特定專案中效果類別的 ResolutionGroupNameExportEffect 屬性 (Attribute) 值。

在執行階段中,當行為附加至 Label 控制項時,Xamarin.LabelShadowEffect 會新增至控制項的 Effects 集合。 這會導致將陰影新增至 Label 控制項所顯示的文字,如下列螢幕擷取畫面所示:

Sample Application with EffectsBehavior

使用此行為在控制項中新增和移除效果的優點是:可以從程式碼後置檔案中移除以定案效果方式處理的程式碼。

摘要

本文示範如何使用行將效果新增至控制項。 類別 EffectBehavior 是可重複使用 Xamarin.Forms 的自定義行為,會在將行為附加至 控件時,將實例加入 Effect 控件中,並在行為與控件中斷連結時移除 Effect 實例。