KeiStory

.NET MAUI Handler 사용하는 방법

 

Handler는 플랫폼 간 UI 컴포넌트(예: 버튼, 레이블)와 해당 컴포넌트의 네이티브 플랫폼 구현 사이의 매핑을 담당합니다.

예를 들어, MAUI의 Button은 iOS에서는 UIButton, Android에서는 Android.Widget.Button으로 구현됩니다.

Xamarin 에서 사용하던 Renderer 와 비슷합니다.

Renderer 는 각 기기 특성을 타는 부분을 각각의 Android, iOS 프로젝트에 네이티브 코드로 처리를 할수 있도록 합니다.

Xamarin 에서는 각 디바이스별로 Renderer 를 구현했지만

.NET MAUI Handler 는 이를 하나의 파일에서 처리 가능하도록 했습니다.

 

Android 에서 Entry 컨트롤에 언더라인이 생기게 되는데 이를 없애려면

Xamarin 에는 아래처럼 Renderer 를 이용해서 없애야했습니다.

Renderer 사용예시 (Android)

using Android.Content;
using Android.Graphics.Drawables;

using APP.Controls;
using APP.Droid.Renderers;

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(CustomEntry), typeof(CustomEntryRenderer))]
namespace APP.Droid.Renderers
{
    public class CustomEntryRenderer : EntryRenderer
    {
        public CustomEntryRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                //Control.SetBackground(null);
            }

            if (Control != null)
            {
                GradientDrawable gd = new GradientDrawable();
                gd.SetColor(global::Android.Graphics.Color.Transparent);
                Control.SetBackground(gd);
            }
        }
    }
}​

하지만 Handler 를 이용하면 아래 처럼 간단하게 언더라인을 제거 할수 있습니다.

MauiProgram.cs

#if ANDROID
		// Entry 에서 언더라인 제거
		Microsoft.Maui.Handlers.EntryHandler.EntryMapper.AppendToMapping("NoUnderline", (h, v) =>
		{
			h.NativeView.BackgroundTintList = ColorStateList.ValueOf(Colors.Transparent.ToAndroid());
		});
#endif

ButtonHandler 등등 각컨트롤에 대해서 처리가 가능하고 직접 만든 UserControl 도 지정이 가능합니다.

아래처럼 정의하고

public class MyButtonHandler : ButtonHandler
{
    public MyButtonHandler() : base()
    {
        // 커스텀 초기화 코드
    }

    protected override void ConnectHandler(Android.Widget.Button nativeView)
    {
        base.ConnectHandler(nativeView);
        // 네이티브 뷰에 대한 추가 설정
        nativeView.SetBackgroundColor(Android.Graphics.Color.Red);
    }

    protected override void DisconnectHandler(Android.Widget.Button nativeView)
    {
        base.DisconnectHandler(nativeView);
        // 연결 해제 시 필요한 정리 작업
    }
}

만들어진 ButtonHandler 를 등록합니다.

var builder = MauiApp.CreateBuilder();
builder
    .UseMauiApp<App>()
    .ConfigureMauiHandlers(handlers =>
    {
        handlers.AddHandler(typeof(Button), typeof(MyButtonHandler));
    });

 

* 추가

Entry 의 글자 색을 기기별로 바꾸고 싶을때는 아래처럼 사용합니다.

		// 기기에 따른 색상 변경
		Microsoft.Maui.Handlers.EntryHandler.EntryMapper.AppendToMapping(nameof(IView.Background), (handler, view) =>
		{
			if (view is Entry)
			{
#if ANDROID
				handler.NativeView.SetTextColor(Colors.Red.ToNative());
#elif IOS
				handler.NativeView.TextColor = Colors.Yellow.ToNative();
#elif WINDOWS
				handler.NativeView.Foreground = Colors.Green.ToNative();
#endif
			}
		});

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band