Xamarin.Forms 동작 만들기

Download Sample 샘플 다운로드

‘ 동작은 Behavior 또는 Behavior<T> 클래스에서 파생되어 만들어집니다.Xamarin.Forms 이 문서에서는 Xamarin.Forms 동작을 만들고 사용하는 방법을 보여 줍니다.

개요

Xamarin.Forms 동작을 만들기 위한 프로세스는 다음과 같습니다.

  1. Behavior 또는 Behavior<T> 클래스에서 상속되는 클래스를 만듭니다. 여기서 T는 동작이 적용되어야 하는 컨트롤의 형식입니다.
  2. 필요한 설정을 수행하도록 OnAttachedTo 메서드를 재정의합니다.
  3. 필요한 정리를 수행하도록 OnDetachingFrom 메서드를 재정의합니다.
  4. 동작의 핵심 기능을 구현합니다.

다음 코드 예제에서 표시된 구조가 됩니다.

public class CustomBehavior : Behavior<View>
{
    protected override void OnAttachedTo (View bindable)
    {
        base.OnAttachedTo (bindable);
        // Perform setup
    }

    protected override void OnDetachingFrom (View bindable)
    {
        base.OnDetachingFrom (bindable);
        // Perform clean up
    }

    // Behavior implementation
}

동작이 컨트롤에 연결된 후 즉시 OnAttachedTo 메서드가 발생합니다. 이 메서드는 연결된 컨트롤에 대한 참조를 받고, 이벤트 처리기를 등록하거나 동작 기능을 지원하는 데 필요한 다른 설정을 수행하는 데 사용할 수 있습니다. 예를 들어 컨트롤에서 이벤트를 구독할 수 있습니다. 그런 다음, 동작 기능은 이벤트에 대한 이벤트 처리기에서 구현됩니다.

동작이 컨트롤에서 제거될 때 OnDetachingFrom 메서드가 발생합니다. 이 메서드는 연결된 컨트롤에 대한 참조를 받고, 필요한 모든 정리를 수행하는 데 사용됩니다. 예를 들어 메모리 누수를 방지하기 위해 컨트롤에서 이벤트를 구독 취소할 수 있습니다.

그런 다음, 적절한 컨트롤의 Behaviors 컬렉션에 연결하여 동작을 사용할 수 있습니다.

Xamarin.Forms 동작 만들기

샘플 애플리케이션은 사용자가 Entry 컨트롤에 입력한 값이 double이 아닌 경우 빨간색으로 강조 표시하는 NumericValidationBehavior를 설명합니다. 동작은 다음 코드 예제에 나와 있습니다.

public class NumericValidationBehavior : Behavior<Entry>
{
    protected override void OnAttachedTo(Entry entry)
    {
        entry.TextChanged += OnEntryTextChanged;
        base.OnAttachedTo(entry);
    }

    protected override void OnDetachingFrom(Entry entry)
    {
        entry.TextChanged -= OnEntryTextChanged;
        base.OnDetachingFrom(entry);
    }

    void OnEntryTextChanged(object sender, TextChangedEventArgs args)
    {
        double result;
        bool isValid = double.TryParse (args.NewTextValue, out result);
        ((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
    }
}

NumericValidationBehaviorBehavior<T> 클래스에서 파생되며, 여기서 TEntry입니다. OnAttachedTo 메서드는 메모리 누수를 방지하도록 TextChanged 이벤트를 등록 취소하는 OnDetachingFrom 메서드를 사용하여 TextChanged 이벤트에 대한 이벤트 처리기를 등록합니다. 동작의 핵심 기능은 OnEntryTextChanged 메서드에서 제공됩니다. 이는 사용자가 Entry에 입력한 값을 구문 분석하고, 값이 double이 아닌 경우 TextColor 속성을 빨간색으로 설정합니다.

참고 항목

동작은 스타일을 통해 공유되고 여러 컨트롤에 적용할 수 있으므로 Xamarin.Forms는 동작의 BindingContext를 설정하지 않습니다.

Xamarin.Forms 동작 사용

모든 Xamarin.Forms 컨트롤에는 다음 XAML 코드 예제에서 설명한 것처럼 하나 이상의 동작을 추가할 수 있는 Behaviors 컬렉션이 있습니다.

<Entry Placeholder="Enter a System.Double">
    <Entry.Behaviors>
        <local:NumericValidationBehavior />
    </Entry.Behaviors>
</Entry>

C#의 해당하는 Entry가 다음 코드 예제에 나와 있습니다.

var entry = new Entry { Placeholder = "Enter a System.Double" };
entry.Behaviors.Add (new NumericValidationBehavior ());

런타임 시 동작은 동작 구현에 따라 응답하여 컨트롤과 상호 작용합니다. 다음 스크린샷에서는 잘못된 입력에 응답하는 동작을 설명합니다.

Sample Application with Xamarin.Forms Behavior

참고 항목

동작은 특정 컨트롤 형식(또는 여러 컨트롤에 적용할 수 있는 슈퍼클래스)에 작성되며, 호환 컨트롤에만 추가해야 합니다. 호환되지 않는 컨트롤에 동작을 연결하면 예외가 throw됩니다.

스타일과 함께 Xamarin.Forms 동작 사용

동작은 명시적 또는 암시적 스타일에 의해 사용될 수도 있습니다. 그러나 속성은 읽기 전용이므로 컨트롤의 Behaviors 속성을 설정하는 스타일을 만드는 것은 불가능합니다. 솔루션은 동작 추가 및 제거를 제어하는 동작 클래스에 연결된 속성을 추가하는 것입니다. 프로세스는 다음과 같습니다.

  1. 동작이 추가되는 컨트롤에 동작의 추가 또는 제거를 제어하는 데 사용될 동작 클래스에 연결된 속성을 추가합니다. 연결된 속성이 속성 값이 변경될 때 실행할 propertyChanged 대리자를 등록하는지 확인합니다.
  2. 연결된 속성에 대한 static getter 및 setter를 만듭니다.
  3. propertyChanged 대리자에서 논리를 구현하여 동작을 추가 및 제거합니다.

다음 코드 예제에서는 NumericValidationBehavior 추가 및 제거를 제어하는 연결된 속성을 보여줍니다.

public class NumericValidationBehavior : Behavior<Entry>
{
    public static readonly BindableProperty AttachBehaviorProperty =
        BindableProperty.CreateAttached ("AttachBehavior", typeof(bool), typeof(NumericValidationBehavior), false, propertyChanged: OnAttachBehaviorChanged);

    public static bool GetAttachBehavior (BindableObject view)
    {
        return (bool)view.GetValue (AttachBehaviorProperty);
    }

    public static void SetAttachBehavior (BindableObject view, bool value)
    {
        view.SetValue (AttachBehaviorProperty, value);
    }

    static void OnAttachBehaviorChanged (BindableObject view, object oldValue, object newValue)
    {
        var entry = view as Entry;
        if (entry == null) {
            return;
        }

        bool attachBehavior = (bool)newValue;
        if (attachBehavior) {
            entry.Behaviors.Add (new NumericValidationBehavior ());
        } else {
            var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
            if (toRemove != null) {
                entry.Behaviors.Remove (toRemove);
            }
        }
    }
    ...
}

NumericValidationBehavior 클래스에는 static getter 및 setter와 함께 AttachBehavior라는 연결된 속성이 포함되어 있습니다. 이는 클래스가 연결될 컨트롤에 동작의 추가 또는 제거를 제어합니다. 이 연결된 속성은 속성 값이 변경될 때 실행할 OnAttachBehaviorChanged 메서드를 등록합니다. 이 메서드는 AttachBehavior 연결된 속성의 값을 기반으로 컨트롤에 동작을 추가 또는 제거합니다.

다음 코드 예제는 AttachBehavior 연결된 속성을 사용하는 NumericValidationBehavior에 대한 명시적 스타일을 보여주며, Entry 컨트롤에 적용될 수 있습니다.

<Style x:Key="NumericValidationStyle" TargetType="Entry">
    <Style.Setters>
        <Setter Property="local:NumericValidationBehavior.AttachBehavior" Value="true" />
    </Style.Setters>
</Style>

다음 코드 예제에 설명된 대로 StaticResource 태그 확장을 사용하여 해당 Style 속성을 Style 인스턴스에 설정하여 StyleEntry 컨트롤에 적용할 수 있습니다.

<Entry Placeholder="Enter a System.Double" Style="{StaticResource NumericValidationStyle}">

스타일에 대한 자세한 내용은 스타일을 참조하세요.

참고 항목

XAML에서 설정되거라 쿼리되는 동작에 바인딩 가능한 속성을 추가할 수 있지만 상태가 있는 동작을 만드는 경우 StyleResourceDictionary에서 컨트롤 간에 공유해서는 안 됩니다.

컨트롤에서 동작 제거

OnDetachingFrom 메서드는 동작이 컨트롤에서 제거되면 발생되며, 메모리 누수를 방지하도록 이벤트 구독 취소와 같은 필요한 모든 정리를 수행하는 데 사용됩니다. 그러나 컨트롤의 Behaviors 컬렉션이 Remove 또는 Clear 메서드에 의해 수정되지 않는 한 동작은 컨트롤에서 암시적으로 제거되지 않습니다. 다음 코드 예제에서는 컨트롤의 Behaviors 컬렉션에서 특정 동작 제거를 보여줍니다.

var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
if (toRemove != null) {
    entry.Behaviors.Remove (toRemove);
}

또는 다음 코드 예제에서 설명한 것처럼 컨트롤의 Behaviors 컬렉션을 지울 수 있습니다.

entry.Behaviors.Clear();

또한 페이지가 탐색 스택에서 팝되는 경우 동작은 컨트롤에서 암시적으로 제거되지 않습니다. 대신 페이지가 범위를 벗어나기 전에 명시적으로 제거되어야 합니다.

요약

이 문서에서는 Xamarin.Forms 동작을 만들고 사용하는 방법을 봤습니다. Xamarin.Forms 동작은 Behavior 또는 Behavior<T> 클래스에서 파생되어 만들어집니다.