Повторно используемая реакция на событие 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
, как показано на следующих снимках экрана.
Преимущество добавления эффектов в элементы управления и удаления эффектов из них с помощью реакций на события заключается в том, что код для обработки стереотипных эффектов можно удалить из файлов кода программной части.
Итоги
В этой статье было продемонстрировано использование реакции на событие для добавления эффекта в элемент управления. Класс EffectBehavior
представляет собой повторно используемую пользовательскую реакцию на событие Xamarin.Forms, которая добавляет экземпляр Effect
в элемент управления, когда реакция на событие присоединяется к элементу управления, и удаляет экземпляр Effect
, когда она отсоединяется от элемента управления.