특성

Browse sample. 샘플 찾아보기

.NET 다중 플랫폼 앱 UI(.NET MAUI) 동작을 사용하면 서브클래스하지 않고도 사용자 인터페이스 컨트롤에 기능을 추가할 수 있습니다. 대신 기능은 동작 클래스에서 구현되고 컨트롤 자체의 일부였던 것처럼 컨트롤에 연결됩니다.

동작을 사용하면 코드가 컨트롤에 간결하게 첨부되고 둘 이상의 애플리케이션에서 재사용하도록 패키지될 수 있도록 컨트롤의 API와 직접 상호 작용하기 때문에, 대개 코드 숨김으로 작성해야 하는 코드를 구현할 수 있습니다. 다음과 같은 컨트롤에 광범위한 기능을 제공하는 데 사용할 수 있습니다.

  • 이메일 유효성 검사기를 Entry에 추가합니다.
  • 탭 제스처 인식기를 사용하여 등급 컨트롤을 만듭니다.
  • 애니메이션을 제어합니다.

.NET MAUI는 세 가지 유형의 동작을 지원합니다.

  • 첨부된 동작은 첨부된 속성이 하나 이상 있는 static 클래스입니다. 연결된 동작에 대한 자세한 내용은 연결된 동작을 참조 하세요.
  • .NET MAUI 동작은 동작이 적용되어야 하는 컨트롤의 형식인 또는 Behavior<T> 클래스에서 Behavior 파생되는 클래스 T 입니다. 자세한 내용은 .NET MAUI 동작을 참조 하세요.
  • 플랫폼 동작은 또는 PlatformBehavior<TView,TPlatformView> 클래스에서 PlatformBehavior<TView> 파생되는 클래스입니다. 이러한 동작은 네이티브 컨트롤의 임의 조건 및 이벤트에 응답할 수 있습니다. 자세한 내용은 플랫폼 동작을 참조 하세요.

연결된 동작

연결된 동작은 연결된 속성이 하나 이상 있는 정적 클래스입니다. 연결된 속성은 특수한 형식의 바인딩 가능 속성입니다. 이는 한 클래스에서 정의되지만 다른 개체에 연결되어 있으며, XAML에서 마침표로 구분된 클래스 및 속성 이름을 포함하는 특성으로 인식할 수 있습니다. 연결된 속성에 대한 자세한 내용은 연결된 속성을 참조 하세요.

연결된 속성은 컨트롤에 속성이 설정된 경우와 같이 속성 값이 변경되면 실행될 propertyChanged 대리자를 정의할 수 있습니다. propertyChanged 대리자가 실행되면 이를 연결할 컨트롤에 대한 참조 및 속성에 대한 이전 및 새 값을 포함하는 매개 변수가 전달됩니다. 다음과 같이 전달된 참조를 조작하여 속성이 연결된 컨트롤에 새 기능을 추가하는 데 이 대리자를 사용할 수 있습니다.

  1. propertyChanged 대리자는 BindableObject로 수신된 컨트롤 참조를 성능 향상을 위해 동작이 설계된 컨트롤 형식으로 캐스트합니다.
  2. propertyChanged 대리자는 핵심 동작 기능을 구현하기 위해 컨트롤의 속성을 수정하거나, 컨트롤의 메서드를 호출하거나, 컨트롤에 의해 노출된 이벤트에 이벤트 처리기를 등록합니다.

Warning

연결된 동작은 속성 및 메서드를 사용하여 static 클래스 static 에 정의됩니다. 이 때문에 상태가 있는 연결된 동작을 만들기가 어려워집니다.

연결된 동작 만들기

대리자를 지정하는 연결된 속성이 포함된 정적 클래스를 만들어 연결된 동작을 propertyChanged 구현할 수 있습니다.

다음 예제에서는 클래스를 AttachedNumericValidationBehavior 보여 줍니다. 이 클래스는 사용자가 입력한 값을 빨간색으로 컨트롤에 입력한 값이 아닌 double경우 빨간색으로 Entry 강조 표시합니다.

public static class AttachedNumericValidationBehavior
{
    public static readonly BindableProperty AttachBehaviorProperty =
        BindableProperty.CreateAttached("AttachBehavior", typeof(bool), typeof(AttachedNumericValidationBehavior), 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)
    {
        Entry entry = view as Entry;
        if (entry == null)
        {
            return;
        }

        bool attachBehavior = (bool)newValue;
        if (attachBehavior)
        {
            entry.TextChanged += OnEntryTextChanged;
        }
        else
        {
            entry.TextChanged -= OnEntryTextChanged;
        }
    }

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

이 예제 AttachedNumericValidationBehavior 에서 클래스는 getter 및 setter로 static 명명 AttachBehavior 된 연결된 속성을 포함하며, 이 속성은 동작이 연결될 컨트롤에 대한 동작의 추가 또는 제거를 제어합니다. 이 연결된 속성은 속성 값이 변경될 때 실행할 OnAttachBehaviorChanged 메서드를 등록합니다. 이 메서드는 AttachBehavior 연결된 속성의 값에 따라 TextChanged 이벤트에 대한 이벤트 처리기를 등록 또는 등록 해제합니다. 동작의 핵심 기능은 메서드에서 OnEntryTextChanged 제공하며, 이 메서드는 입력한 Entry 값을 구문 분석하고 값이 TextColor 아닌 경우 속성을 빨간색으로 double설정합니다.

연결된 동작 사용

연결된 동작은 대상 컨트롤에서 연결된 속성을 설정하여 사용할 수 있습니다.

다음 예제에서는 연결된 속성을 다음 항목에 Entry 추가하여 클래스를 AttachBehavior 사용하는 AttachedNumericValidationBehavior 방법을 Entry보여줍니다.


<ContentPage ...
             xmlns:local="clr-namespace:BehaviorsDemos">
    <Entry Placeholder="Enter a System.Double" local:AttachedNumericValidationBehavior.AttachBehavior="true" />
</ContentPage>

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

Entry entry = new Entry { Placeholder = "Enter a System.Double" };
AttachedNumericValidationBehavior.SetAttachBehavior(entry, true);

다음 스크린샷은 잘못된 입력에 응답하는 연결된 동작을 보여줍니다.

Screenshot of attached behavior responding to invalid input

참고 항목

연결된 동작은 특정 컨트롤 형식(또는 여러 컨트롤에 적용할 수 있는 슈퍼클래스)에 작성되며 호환 컨트롤에만 추가해야 합니다.

연결된 동작 제거

AttachedNumericValidationBehavior 연결된 속성을 false다음으로 설정하여 컨트롤에서 클래스를 AttachBehavior 제거할 수 있습니다.

<Entry Placeholder="Enter a System.Double" local:AttachedNumericValidationBehavior.AttachBehavior="false" />

런타임 시 AttachBehavior 연결된 속성의 값이 false로 설정된 경우 OnAttachBehaviorChanged 메서드가 실행됩니다. 그런 다음 메서드는 OnAttachBehaviorChanged 이벤트에 대한 TextChanged 이벤트 처리기를 등록 해제하여 컨트롤과 상호 작용할 때 동작이 실행되지 않도록 합니다.

.NET MAUI 동작

.NET MAUI 동작은 또는 Behavior<T> 클래스에서 Behavior 파생하여 생성됩니다.

.NET MAUI 동작을 만드는 프로세스는 다음과 같습니다.

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

그러면 다음 예제에 표시된 구조체가 생성됩니다.

public class MyBehavior : 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 사용할 수 있습니다.

.NET MAUI 동작 만들기

.NET MAUI 동작은 또는 클래스에서 Behavior 파생되는 클래스를 만들고 메서드와 OnDetachingFrom 메서드를 재정의 OnAttachedTo 하여 구현할 수 Behavior<T> 있습니다.

다음 예제에서는 클래스를 NumericValidationBehavior 보여 줍니다. 이 클래스는 사용자가 입력한 값을 빨간색으로 컨트롤에 입력한 값이 아닌 double경우 빨간색으로 Entry 강조 표시합니다.

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 ? Colors.Black : Colors.Red;
    }
}

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

Important

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

.NET MAUI 동작 사용

모든 .NET MAUI 컨트롤에는 Behaviors 하나 이상의 동작을 추가할 수 있는 컬렉션이 있습니다.

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

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

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

다음 스크린샷은 잘못된 입력에 응답하는 .NET MAUI 동작을 보여줍니다.

Screenshot of .NET MAUI behavior responding to invalid input

Warning

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

스타일을 사용하여 .NET MAUI 동작 사용

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

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

다음 예제에서는 동작 추가 NumericValidationStyleBehavior 및 제거를 제어하는 연결된 속성이 있는 클래스를 보여 줍니다.

public class NumericValidationStyleBehavior : Behavior<Entry>
{
    public static readonly BindableProperty AttachBehaviorProperty =
        BindableProperty.CreateAttached("AttachBehavior", typeof(bool), typeof(NumericValidationStyleBehavior), 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)
    {
        Entry entry = view as Entry;
        if (entry == null)
        {
            return;
        }

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

    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 ? Colors.Black : Colors.Red;
    }
}

이 예제 NumericValidationStyleBehavior 에서 클래스는 getter 및 setter로 static 명명 AttachBehavior 된 연결된 속성을 포함하며, 이 속성은 동작이 연결될 컨트롤에 대한 동작의 추가 또는 제거를 제어합니다. 이 연결된 속성은 속성 값이 변경될 때 실행할 OnAttachBehaviorChanged 메서드를 등록합니다. 이 메서드는 AttachBehavior 연결된 속성의 값을 기반으로 컨트롤에 동작을 추가 또는 제거합니다.

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

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

Style 태그 확장을 사용하여 StaticResource 해당 Style 속성을 스타일로 설정하여 적용할 Entry 수 있습니다.

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

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

참고 항목

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

.NET MAUI 동작 제거

OnDetachingFrom 메서드는 동작이 컨트롤에서 제거될 때 호출되며 메모리 누수 방지를 위해 이벤트에서 구독 취소와 같은 필수 클린 작업을 수행하는 데 사용됩니다. 그러나 컨트롤의 Behaviors 컬렉션이 또는 Clear 메서드에 의해 Remove 수정되지 않는 한 동작은 컨트롤에서 암시적으로 제거되지 않습니다.

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

또는 컨트롤의 Behaviors 컬렉션을 지울 수 있습니다.

entry.Behaviors.Clear();

참고 항목

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

플랫폼 동작

플랫폼 동작은 또는 PlatformBehavior<TView,TPlatformView> 클래스에서 PlatformBehavior<TView> 파생하여 생성됩니다. 네이티브 컨트롤의 임의 조건 및 이벤트에 응답합니다.

플랫폼 동작은 조건부 컴파일 또는 부분 클래스를 통해 구현할 수 있습니다. 여기서 채택된 접근 방식은 부분 클래스를 사용하는 것입니다. 여기서 플랫폼 동작은 일반적으로 동작 API를 정의하는 플랫폼 간 부분 클래스와 각 플랫폼에서 동작을 구현하는 네이티브 partial 클래스로 구성됩니다. 빌드 시 다중 대상 지정은 부분 클래스를 결합하여 각 플랫폼에서 플랫폼 동작을 빌드합니다.

플랫폼 동작을 만드는 프로세스는 다음과 같습니다.

  1. 플랫폼 동작에 대한 API를 정의하는 플랫폼 간 부분 클래스를 만듭니다.

  2. 플랫폼 간 부분 클래스와 동일한 이름을 가진 앱이 빌드된 각 플랫폼에 네이티브 부분 클래스를 만듭니다. 이 네이티브 부분 클래스는 동작이 적용되어야 하는 플랫폼 간 컨트롤인 또는 PlatformBehavior<TView,TPlatformView> 클래스 TView 에서 PlatformBehavior<TView> 상속되어야 하며TPlatformView, 특정 플랫폼에서 플랫폼 간 컨트롤을 구현하는 네이티브 뷰입니다.

    참고 항목

    앱이 빌드되는 각 플랫폼에서 네이티브 부분 클래스를 만들어야 하지만 모든 플랫폼에서 플랫폼 동작 기능을 구현할 필요는 없습니다. 예를 들어 일부 플랫폼에서 네이티브 컨트롤의 테두리 두께를 수정하는 플랫폼 동작을 만들 수 있습니다.

  3. 플랫폼 동작을 구현하는 데 필요한 각 네이티브 부분 클래스에서 다음을 수행해야 합니다.

    1. 모든 설정을 수행하도록 메서드를 재정의 OnAttachedTo 합니다.
    2. 클린 수행하도록 메서드를 재정의 OnDetachedFrom 합니다.
    3. 플랫폼 동작의 핵심 기능을 구현합니다.

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

플랫폼 동작 만들기

플랫폼 동작을 만들려면 먼저 플랫폼 동작에 대한 API를 정의하는 플랫폼 간 부분 클래스를 만들어야 합니다.

namespace BehaviorsDemos
{
    public partial class TintColorBehavior
    {
        public static readonly BindableProperty TintColorProperty =
            BindableProperty.Create(nameof(TintColor), typeof(Color), typeof(TintColorBehavior));

        public Color TintColor
        {
            get => (Color)GetValue(TintColorProperty);
            set => SetValue(TintColorProperty, value);
        }
    }
}

플랫폼 동작은 동일한 이름을 사용하는 추가 partial 클래스를 사용하여 필요한 각 플랫폼에서 구현이 완료되는 부분 클래스입니다. 이 예제에서 클래스는 TintColorBehavior 지정된 색으로 이미지를 색조로 만드는 단일 바인딩 가능한 속성을 TintColor정의합니다.

플랫폼 간 partial 클래스를 만든 후에는 앱을 빌드하는 각 플랫폼에 네이티브 partial 클래스를 만들어야 합니다. Platforms 폴더의 필수 자식 폴더에 부분 클래스를 추가하여 이 작업을 수행할 수 있습니다.

Screenshot of the native partial classes for a platform behavior.

또는 파일 이름 기반 다중 대상 지정 또는 폴더 기반 다중 대상 지정 또는 둘 다를 지원하도록 프로젝트를 구성할 수 있습니다. 다중 대상 지정에 대한 자세한 내용은 다중 대상 지정 구성을 참조 하세요.

네이티브 부분 클래스는 클래스 또는 클래스에서 PlatformBehavior<TView> 상속되어야 합니다. 여기서 TView 동작이 적용되어야 하는 플랫폼 간 컨트롤이며 TPlatformView 특정 플랫폼에서 플랫폼 간 컨트롤을 구현하는 네이티브 뷰 PlatformBehavior<TView,TPlatformView> 입니다. 플랫폼 동작을 구현하는 데 필요한 각 네이티브 부분 클래스에서 메서드와 메서드를 OnDetachedFrom 재정 OnAttachedTo 의하고 플랫폼 동작의 핵심 기능을 구현해야 합니다.

플랫폼 OnAttachedTo 동작이 플랫폼 간 컨트롤에 연결된 직후 메서드가 호출됩니다. 이 메서드는 연결된 플랫폼 간 컨트롤에 대한 참조와 플랫폼 간 컨트롤을 구현하는 네이티브 컨트롤에 대한 참조를 선택적으로 받습니다. 이 메서드를 사용하여 이벤트 처리기를 등록하거나 플랫폼 동작 기능을 지원하는 데 필요한 다른 설정을 수행할 수 있습니다. 예를 들어 컨트롤에서 이벤트를 구독할 수 있습니다. 그런 다음, 동작 기능은 이벤트에 대한 이벤트 처리기에서 구현됩니다.

OnDetachedFrom 메서드는 플랫폼 간 컨트롤에서 동작이 제거될 때 호출됩니다. 메서드는 연결된 컨트롤에 대한 참조와 플랫폼 간 컨트롤을 구현하는 네이티브 컨트롤에 대한 참조를 선택적으로 받습니다. 필요한 클린 수행하는 데 메서드를 사용해야 합니다. 예를 들어 메모리 누수를 방지하기 위해 컨트롤에서 이벤트를 구독 취소할 수 있습니다.

Important

부분 클래스는 동일한 네임스페이스에 상주하고 동일한 이름을 사용해야 합니다.

다음 예제에서는 지정된 색으로 TintColorBehavior 이미지를 색조로 지정하는 Android의 부분 클래스를 보여 줍니다.

using Android.Graphics;
using Android.Widget;
using Microsoft.Maui.Platform;
using Color = Microsoft.Maui.Graphics.Color;

namespace BehaviorsDemos
{
    public partial class TintColorBehavior : PlatformBehavior<Image, ImageView>
    {
        protected override void OnAttachedTo(Image bindable, ImageView platformView)
        {
            base.OnAttachedTo(bindable, platformView);

            if (bindable is null)
                return;
            if (TintColor is null)
                ClearColor(platformView);
            else
                ApplyColor(platformView, TintColor);
        }

        protected override void OnDetachedFrom(Image bindable, ImageView platformView)
        {
            base.OnDetachedFrom(bindable, platformView);

            if (bindable is null)
                return;
            ClearColor(platformView);
        }

        void ApplyColor(ImageView imageView, Color color)
        {
            imageView.SetColorFilter(new PorterDuffColorFilter(color.ToPlatform(), PorterDuff.Mode.SrcIn ?? throw new NullReferenceException()));
        }

        void ClearColor(ImageView imageView)
        {
            imageView.ClearColorFilter();
        }
    }
}

이 예제에서 클래스는 TintColorBehavior 클래스에서 PlatformBehavior<TView,TPlatformView> 파생되며 여기서는 ImageTView/a0TPlatformView>ImageView입니다. OnAttachedTo 속성에 값이 있는 경우 이미지에 색조 색을 TintColor 적용합니다. 이 메서드는 OnDetachedFrom 이미지에서 색조 색을 제거합니다.

앱을 빌드하는 각 플랫폼에 네이티브 부분 클래스를 추가해야 합니다. 그러나 특정 플랫폼에서 플랫폼 동작이 필요하지 않은 경우 네이티브 부분 클래스 NO-OP를 만들 수 있습니다. 빈 클래스를 제공하여 이 작업을 수행할 수 있습니다.

using Microsoft.UI.Xaml;

namespace BehaviorsDemos
{
    public partial class TintColorBehavior : PlatformBehavior<Image, FrameworkElement>
    {
        // NO-OP on Windows
    }
}

Important

.NET MAUI는 플랫폼 동작을 BindingContext 설정하지 않습니다.

플랫폼 동작 사용

모든 .NET MAUI 컨트롤에는 Behaviors 하나 이상의 플랫폼 동작을 추가할 수 있는 컬렉션이 있습니다.

<Image Source="dotnet_bot.png"
       HeightRequest="200"
       HorizontalOptions="Center">
    <Image.Behaviors>
        <local:TintColorBehavior TintColor="Red" />
    </Image.Behaviors>
</Image>

C#의 해당 Image 항목은 다음 예제에 나와 있습니다.

Image image = new Image { Source = "dotnet_bot.png", HeightRequest = 200, HorizontalOptions = LayoutOptions.Center };
image.Behaviors.Add(new TintColorBehavior());

다음 스크린샷은 이미지를 주석으로 팅하는 플랫폼 동작을 보여줍니다.

Screenshot of .NET MAUI platform behavior tinting an image.

Warning

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