Поделиться через


Повторно используемая реакция на событие EffectBehavior

Реакции на события удобно использовать для добавления эффекта в элемент управления, удаления стереотипного эффекта, обработки кода из файлов кода программной части. В этой статье демонстрируется создание и использование реакции на событие Xamarin.Forms для добавления эффекта в элемент управления.

Обзор

Класс EffectBehavior представляет собой повторно используемую пользовательскую реакцию на событие Xamarin.Forms, которая добавляет экземпляр Effect в элемент управления, когда реакция на событие присоединяется к элементу управления, и удаляет экземпляр Effect, когда она отсоединяется от элемента управления.

Для использования реакции на событие необходимо задать следующие ее свойства:

  • Group — значение атрибута ResolutionGroupName для класса эффекта;
  • Name — значение атрибута ExportEffect для класса эффекта.

Дополнительные сведения об эффектах см. в статье Эффекты.

Примечание.

Это EffectBehavior пользовательский класс, который может находиться в примере и не является частью Xamarin.Forms.

Создание реакции на событие

Класс EffectBehavior является производным от класса Behavior<T>, где T — это View. Это означает, что класс 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 должно присваиваться значение атрибута ResolutionGroupName для эффекта. Кроме того, свойству Name должно присваиваться значение атрибута ExportEffect для класса эффекта.

Реализация переопределений

В классе EffectBehavior переопределяются методы OnAttachedTo и OnDetachingFrom класса Behavior<T>, как показано в следующем примере кода.

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 и передавая присоединенный элемент управления в качестве параметра.

Реализация функциональности реакции на событие

Назначение реакции на событие заключается в добавлении эффекта Effect, определенного в свойствах Group и Name, в элемент управления, когда реакция на событие присоединяется к элементу управления, и удалении 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 с помощью метода Effect.Resolve. Эффект определяется путем объединения значений свойств Group и Name. Если платформа не предоставляет эффект, метод 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"
});

Свойствам Group и Name реакции на событие присваиваются значения атрибутов ResolutionGroupName и ExportEffect для класса эффекта в каждом зависящем от платформы проекте.

Когда во время выполнения реакция на событие присоединяется к элементу управления Label, Xamarin.LabelShadowEffect добавляется в коллекцию Effects элемента управления. В результате тень добавляется к тексту, отображаемому элементом управления Label, как показано на следующих снимках экрана.

Пример приложения с EffectsBehavior

Преимущество добавления эффектов в элементы управления и удаления эффектов из них с помощью реакций на события заключается в том, что код для обработки стереотипных эффектов можно удалить из файлов кода программной части.

Итоги

В этой статье было продемонстрировано использование реакции на событие для добавления эффекта в элемент управления. Класс EffectBehavior представляет собой повторно используемую пользовательскую реакцию на событие Xamarin.Forms, которая добавляет экземпляр Effect в элемент управления, когда реакция на событие присоединяется к элементу управления, и удаляет экземпляр Effect, когда она отсоединяется от элемента управления.