재사용 가능한 EffectBehaviorReusable EffectBehavior

샘플 다운로드 샘플 다운로드Download Sample Download the sample

동작은 컨트롤에 효과를 추가하고 코드 숨김 파일에서 표준 효과 처리 코드를 제거하는 데 유용한 방법입니다. 이 문서에서는 Xamarin.Forms 동작을 만들고 사용하여 는 컨트롤에 효과를 추가하는 방법을 보여 줍니다.Behaviors are a useful approach for adding an effect to a control, removing boiler-plate effect handling code from code-behind files. This article demonstrates creating and consuming a Xamarin.Forms behavior to add an effect to a control.

개요Overview

EffectBehavior 클래스는 재사용 가능한 Xamarin.Forms 사용자 지정 동작입니다. 즉 동작이 컨트롤에 연결되면 Effect 인스턴스를 컨트롤에 추가하고, 동작이 컨트롤에서 분리되면 Effect 인스턴스를 제거합니다.The EffectBehavior class is a reusable Xamarin.Forms custom behavior that adds an Effect instance to a control when the behavior is attached to the control, and removes the Effect instance when the behavior is detached from the control.

동작을 사용하기 위해 설정해야 하는 동작 속성은 다음과 같습니다.The following behavior properties must be set to use the behavior:

효과에 대한 자세한 내용은 효과를 참조하세요.For more information about effects, see Effects.

참고

EffectBehavior효과 동작 샘플에 있는 사용자 지정 클래스이며, Xamarin.Forms의 일부가 아닙니다.The EffectBehavior is a custom class that can be located in the Effect Behavior sample, and is not part of Xamarin.Forms.

동작 만들기Creating the Behavior

EffectBehavior 클래스는 Behavior<T> 클래스에서 파생되며, 여기서 TView입니다.The EffectBehavior class derives from the Behavior<T> class, where T is a View. EffectBehavior 클래스를 모든 Xamarin.Forms 컨트롤에 연결할 수 있습니다.This means that the EffectBehavior class can be attached to any Xamarin.Forms control.

바인딩 가능한 속성 구현Implementing Bindable Properties

EffectBehavior 클래스는 두 개의 BindableProperty 인스턴스를 정의합니다. 이러한 인스턴스는 동작이 컨트롤에 연결되면 Effect를 컨트롤에 추가하는 데 사용됩니다.The EffectBehavior class defines two BindableProperty instances, which are used to add an Effect to a control when the behavior is attached to the control. 이러한 속성은 다음 코드 예제와 같습니다.These properties are shown in the following code example:

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 특성의 값으로 설정해야 합니다.When the EffectBehavior is consumed, the Group property should be set to the value of the ResolutionGroupName attribute for the effect. 또한 Name 속성을 효과 클래스에 대한 ExportEffect 특성의 값으로 설정해야 합니다.In addition, the Name property should be set to the value of the ExportEffect attribute for the effect class.

재정의 구현Implementing the Overrides

EffectBehavior 클래스는 다음 코드 예제와 같이 Behavior<T> 클래스의 OnAttachedToOnDetachingFrom 메서드를 재정의합니다.The EffectBehavior class overrides the OnAttachedTo and OnDetachingFrom methods of the Behavior<T> class, as shown in the following code example:

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 메서드를 호출하여 연결된 컨트롤을 매개 변수로 전달함으로써 설치를 수행합니다.The OnAttachedTo method performs setup by calling the AddEffect method, passing in the attached control as a parameter. OnDetachingFrom 메서드는 RemoveEffect 메서드를 호출하여 연결된 컨트롤을 매개 변수로 전달함으로써 정리를 수행합니다.The OnDetachingFrom method performs cleanup by calling the RemoveEffect method, passing in the attached control as a parameter.

동작 기능 구현Implementing the Behavior Functionality

동작의 목적은 동작이 컨트롤에 연결되면 GroupName 속성에 정의된 Effect를 컨트롤에 추가하고, 동작이 컨트롤에서 분리되면 Effect를 제거하는 것입니다.The purpose of the behavior is to add the Effect defined in the Group and Name properties to a control when the behavior is attached to the control, and remove the Effect when the behavior is detached from the control. 핵심 동작 기능은 다음 코드 예제와 같습니다.The core behavior functionality is shown in the following code example:

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에 대한 응답으로 실행되며, 연결된 컨트롤을 매개 변수로 받습니다.The AddEffect method is executed in response to the EffectBehavior being attached to a control, and it receives the attached control as a parameter. 그런 다음, 이 메서드는 검색된 효과를 컨트롤의 Effects 컬렉션에 추가합니다.The method then adds the retrieved effect to the control's Effects collection. RemoveEffect 메서드는 컨트롤에서 분리되는 EffectBehavior에 대한 응답으로 실행되며, 연결된 컨트롤을 매개 변수로 받습니다.The RemoveEffect method is executed in response to the EffectBehavior being detached from a control, and it receives the attached control as a parameter. 그런 다음, 이 메서드는 컨트롤의 Effects 컬렉션에서 효과를 제거합니다.The method then removes the effect from the control's Effects collection.

GetEffect 메서드는 Effect.Resolve 메서드를 사용하여 Effect를 검색합니다.The GetEffect method uses the Effect.Resolve method to retrieve the Effect. 효과는 GroupName 속성 값의 연결을 통해 찾습니다.The effect is located through a concatenation of the Group and Name property values. 플랫폼에서 효과를 제공하지 않으면 Effect.Resolve 메서드에서 null이 아닌 값을 반환합니다.If a platform doesn't provide the effect, the Effect.Resolve method will return a non-null value.

동작 사용Consuming the Behavior

EffectBehavior 클래스는 다음 XAML 코드 예제와 같이 컨트롤의 Behaviors 컬렉션에 연결할 수 있습니다.The EffectBehavior class can be attached to the Behaviors collection of a control, as demonstrated in the following XAML code example:

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

동등한 C# 코드는 다음 코드 예제와 같습니다.The equivalent C# code is shown in the following code example:

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

동작의 GroupName 속성은 각 플랫폼별 프로젝트의 효과 클래스에 대한 ResolutionGroupNameExportEffect 특성의 값으로 설정됩니다.The Group and Name properties of the behavior are set to the values of the ResolutionGroupName and ExportEffect attributes for the effect class in each platform-specific project.

런타임에 동작이 Label 컨트롤에 연결되면 Xamarin.LabelShadowEffect가 컨트롤의 Effects 컬렉션에 추가됩니다.At runtime, when the behavior is attached to the Label control, the Xamarin.LabelShadowEffect will be added to the control's Effects collection. 그러면 다음 스크린샷과 같이 Label 컨트롤에 표시되는 텍스트에 그림자가 추가됩니다.This results in a shadow being added to the text displayed by the Label control, as shown in the following screenshots:

컨트롤에서 효과를 추가하고 제거하는 데 이러한 동작을 사용하면 표준 효과 처리 코드를 코드 숨김 파일에서 제거할 수 있다는 이점이 있습니다.The advantage of using this behavior to add and remove effects from controls is that boiler-plate effect-handling code can be removed from code-behind files.

요약Summary

이 문서에서는 동작을 사용하여 컨트롤에 효과를 추가하는 방법을 보여 주었습니다.This article demonstrated using a behavior to add an effect to a control. EffectBehavior 클래스는 재사용 가능한 Xamarin.Forms 사용자 지정 동작입니다. 즉 동작이 컨트롤에 연결되면 Effect 인스턴스를 컨트롤에 추가하고, 동작이 컨트롤에서 분리되면 Effect 인스턴스를 제거합니다.The EffectBehavior class is a reusable Xamarin.Forms custom behavior that adds an Effect instance to a control when the behavior is attached to the control, and removes the Effect instance when the behavior is detached from the control.